diff --git a/frontend/src/pages/inbounds/form/useSecurityActions.ts b/frontend/src/pages/inbounds/form/useSecurityActions.ts index f9012494..e3ca1796 100644 --- a/frontend/src/pages/inbounds/form/useSecurityActions.ts +++ b/frontend/src/pages/inbounds/form/useSecurityActions.ts @@ -99,9 +99,7 @@ export function useSecurityActions({ form, setSaving, messageApi }: UseSecurityA const generateRandomPinHash = () => { const bytes = new Uint8Array(32); crypto.getRandomValues(bytes); - let binary = ''; - for (const b of bytes) binary += String.fromCharCode(b); - const hash = btoa(binary); + const hash = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join(''); const current = (form.getFieldValue( ['streamSettings', 'tlsSettings', 'settings', 'pinnedPeerCertSha256'], ) as string[] | undefined) ?? []; diff --git a/web/translation/ar-EG.json b/web/translation/ar-EG.json index 74cb3420..6c20acf2 100644 --- a/web/translation/ar-EG.json +++ b/web/translation/ar-EG.json @@ -555,8 +555,8 @@ "echKey": "ECH key", "echConfig": "تكوين ECH", "pinnedPeerCertSha256": "SHA-256 لشهادة النظير المثبَّتة", - "pinnedPeerCertSha256Tip": "تجزئات SHA-256 المُرمَّزة بـ Base64 لشهادة النظير. للوحة فقط — لا تُكتب في إعدادات xray على الخادم، لكنها تُضمَّن في روابط المشاركة ليتمكَّن العملاء من تثبيت الشهادة.", - "pinnedPeerCertSha256Placeholder": "تجزئة (تجزئات) base64، مفصولة بفواصل", + "pinnedPeerCertSha256Tip": "تجزئات SHA-256 لشهادة النظير كسلسلة سداسية عشرية (مثل e8e2d3…)، مفصولة بفواصل. للوحة فقط — لا تُكتب في إعدادات xray على الخادم، لكنها تُضمَّن في روابط المشاركة ليتمكَّن العملاء من تثبيت الشهادة.", + "pinnedPeerCertSha256Placeholder": "تجزئة (تجزئات) سداسية عشرية، مفصولة بفواصل", "generateRandomPin": "إنشاء تجزئة عشوائية", "getNewEchCert": "احصل على شهادة ECH جديدة", "show": "عرض", diff --git a/web/translation/en-US.json b/web/translation/en-US.json index 09c3bd14..3fd37bda 100644 --- a/web/translation/en-US.json +++ b/web/translation/en-US.json @@ -555,8 +555,8 @@ "echKey": "ECH key", "echConfig": "ECH config", "pinnedPeerCertSha256": "Pinned Peer Cert SHA-256", - "pinnedPeerCertSha256Tip": "Base64-encoded SHA-256 hashes of the peer certificate. Panel-only — not written to the server's xray config, but included in share links so clients can pin the certificate.", - "pinnedPeerCertSha256Placeholder": "base64 hash(es), comma-separated", + "pinnedPeerCertSha256Tip": "SHA-256 hash(es) of the peer certificate as a hex string (e.g. e8e2d3…), comma-separated. Panel-only — not written to the server's xray config, but included in share links so clients can pin the certificate.", + "pinnedPeerCertSha256Placeholder": "hex hash(es), comma-separated", "generateRandomPin": "Generate random hash", "getNewEchCert": "Get New ECH Cert", "show": "Show", diff --git a/web/translation/es-ES.json b/web/translation/es-ES.json index baf0703e..69d6d55d 100644 --- a/web/translation/es-ES.json +++ b/web/translation/es-ES.json @@ -555,8 +555,8 @@ "echKey": "ECH key", "echConfig": "Config ECH", "pinnedPeerCertSha256": "SHA-256 del cert. del par fijado", - "pinnedPeerCertSha256Tip": "Hashes SHA-256 codificados en Base64 del certificado del par. Solo en el panel — no se escribe en la config xray del servidor, pero se incluye en los enlaces para que los clientes puedan fijar el certificado.", - "pinnedPeerCertSha256Placeholder": "hash(es) base64, separados por comas", + "pinnedPeerCertSha256Tip": "Hashes SHA-256 del certificado del par como cadena hexadecimal (p. ej. e8e2d3…), separados por comas. Solo en el panel — no se escribe en la config xray del servidor, pero se incluye en los enlaces para que los clientes puedan fijar el certificado.", + "pinnedPeerCertSha256Placeholder": "hash(es) hexadecimal, separados por comas", "generateRandomPin": "Generar hash aleatorio", "getNewEchCert": "Obtener nuevo cert ECH", "show": "Mostrar", diff --git a/web/translation/fa-IR.json b/web/translation/fa-IR.json index ae9af552..1dcb3115 100644 --- a/web/translation/fa-IR.json +++ b/web/translation/fa-IR.json @@ -555,8 +555,8 @@ "echKey": "کلید ECH", "echConfig": "پیکربندی ECH", "pinnedPeerCertSha256": "SHA-256 پین‌شدهٔ گواهی همتا", - "pinnedPeerCertSha256Tip": "هش‌های SHA-256 با کدگذاری Base64 از گواهی همتا. فقط در پنل — در پیکربندی xray سرور نوشته نمی‌شود، اما در لینک‌های اشتراک‌گذاری گنجانده می‌شود تا کلاینت‌ها بتوانند گواهی را پین کنند.", - "pinnedPeerCertSha256Placeholder": "هش(های) base64، با کاما جدا شوند", + "pinnedPeerCertSha256Tip": "هش‌های SHA-256 گواهی همتا به‌صورت رشتهٔ هگزادسیمال (مثل e8e2d3…)، با کاما جدا شوند. فقط در پنل — در پیکربندی xray سرور نوشته نمی‌شود، اما در لینک‌های اشتراک‌گذاری گنجانده می‌شود تا کلاینت‌ها بتوانند گواهی را پین کنند.", + "pinnedPeerCertSha256Placeholder": "هش(های) هگزادسیمال، با کاما جدا شوند", "generateRandomPin": "تولید هش تصادفی", "getNewEchCert": "دریافت گواهی ECH جدید", "show": "نمایش", diff --git a/web/translation/id-ID.json b/web/translation/id-ID.json index aa54ea8a..4ab5bde0 100644 --- a/web/translation/id-ID.json +++ b/web/translation/id-ID.json @@ -555,8 +555,8 @@ "echKey": "ECH key", "echConfig": "Konfig ECH", "pinnedPeerCertSha256": "SHA-256 Sertifikat Peer Tersemat", - "pinnedPeerCertSha256Tip": "Hash SHA-256 berenkode Base64 dari sertifikat peer. Hanya panel — tidak ditulis ke konfig xray server, tetapi disertakan dalam link berbagi agar klien dapat menyematkan sertifikat.", - "pinnedPeerCertSha256Placeholder": "hash base64, dipisah koma", + "pinnedPeerCertSha256Tip": "Hash SHA-256 dari sertifikat peer sebagai string heksadesimal (mis. e8e2d3…), dipisah koma. Hanya panel — tidak ditulis ke konfig xray server, tetapi disertakan dalam link berbagi agar klien dapat menyematkan sertifikat.", + "pinnedPeerCertSha256Placeholder": "hash heksadesimal, dipisah koma", "generateRandomPin": "Hasilkan hash acak", "getNewEchCert": "Dapatkan sertifikat ECH baru", "show": "Tampilkan", diff --git a/web/translation/ja-JP.json b/web/translation/ja-JP.json index a19c95f5..7e07dc82 100644 --- a/web/translation/ja-JP.json +++ b/web/translation/ja-JP.json @@ -555,8 +555,8 @@ "echKey": "ECH key", "echConfig": "ECH config", "pinnedPeerCertSha256": "ピン留めピア証明書 SHA-256", - "pinnedPeerCertSha256Tip": "ピア証明書の Base64 エンコード SHA-256 ハッシュ。パネルのみ — サーバーの xray 設定には書き込まれませんが、共有リンクには含まれ、クライアントが証明書をピン留めできます。", - "pinnedPeerCertSha256Placeholder": "Base64 ハッシュ、カンマ区切り", + "pinnedPeerCertSha256Tip": "ピア証明書の SHA-256 ハッシュ(16進数文字列、例: e8e2d3…)、カンマ区切り。パネルのみ — サーバーの xray 設定には書き込まれませんが、共有リンクには含まれ、クライアントが証明書をピン留めできます。", + "pinnedPeerCertSha256Placeholder": "16進ハッシュ、カンマ区切り", "generateRandomPin": "ランダムハッシュを生成", "getNewEchCert": "新しい ECH 証明書を取得", "show": "表示", diff --git a/web/translation/pt-BR.json b/web/translation/pt-BR.json index 0315f6a8..ee86885d 100644 --- a/web/translation/pt-BR.json +++ b/web/translation/pt-BR.json @@ -555,8 +555,8 @@ "echKey": "ECH key", "echConfig": "Config ECH", "pinnedPeerCertSha256": "SHA-256 do cert. do par fixado", - "pinnedPeerCertSha256Tip": "Hashes SHA-256 codificados em Base64 do certificado do par. Apenas no painel — não é gravado na config xray do servidor, mas é incluído nos links de compartilhamento para que clientes possam fixar o certificado.", - "pinnedPeerCertSha256Placeholder": "hash(es) base64, separados por vírgula", + "pinnedPeerCertSha256Tip": "Hashes SHA-256 do certificado do par como string hexadecimal (ex. e8e2d3…), separados por vírgula. Apenas no painel — não é gravado na config xray do servidor, mas é incluído nos links de compartilhamento para que clientes possam fixar o certificado.", + "pinnedPeerCertSha256Placeholder": "hash(es) hexadecimal, separados por vírgula", "generateRandomPin": "Gerar hash aleatório", "getNewEchCert": "Obter novo certificado ECH", "show": "Mostrar", diff --git a/web/translation/ru-RU.json b/web/translation/ru-RU.json index a936c420..4107284a 100644 --- a/web/translation/ru-RU.json +++ b/web/translation/ru-RU.json @@ -555,8 +555,8 @@ "echKey": "ECH key", "echConfig": "ECH config", "pinnedPeerCertSha256": "Закреплённый SHA-256 сертификата пира", - "pinnedPeerCertSha256Tip": "SHA-256-хеши сертификата пира в кодировке Base64. Только для панели — не записывается в конфиг xray сервера, но включается в ссылки-приглашения, чтобы клиенты могли закрепить сертификат.", - "pinnedPeerCertSha256Placeholder": "Base64-хеш(и), через запятую", + "pinnedPeerCertSha256Tip": "SHA-256-хеши сертификата пира в виде шестнадцатеричной строки (напр. e8e2d3…), через запятую. Только для панели — не записывается в конфиг xray сервера, но включается в ссылки-приглашения, чтобы клиенты могли закрепить сертификат.", + "pinnedPeerCertSha256Placeholder": "шестнадцатеричный хеш(и), через запятую", "generateRandomPin": "Сгенерировать случайный хеш", "getNewEchCert": "Получить новый ECH-сертификат", "show": "Показать", diff --git a/web/translation/tr-TR.json b/web/translation/tr-TR.json index 1d221a90..276cc773 100644 --- a/web/translation/tr-TR.json +++ b/web/translation/tr-TR.json @@ -555,8 +555,8 @@ "echKey": "ECH key", "echConfig": "ECH yapılandırması", "pinnedPeerCertSha256": "Sabitlenmiş Peer Sertifikası SHA-256", - "pinnedPeerCertSha256Tip": "Peer sertifikasının Base64 kodlu SHA-256 hash'leri. Sadece panel — sunucunun xray yapılandırmasına yazılmaz, ancak istemcilerin sertifikayı sabitleyebilmesi için paylaşım bağlantılarına eklenir.", - "pinnedPeerCertSha256Placeholder": "base64 hash(ler), virgülle ayrılmış", + "pinnedPeerCertSha256Tip": "Peer sertifikasının SHA-256 hash'leri onaltılık (hex) dizge olarak (örn. e8e2d3…), virgülle ayrılmış. Sadece panel — sunucunun xray yapılandırmasına yazılmaz, ancak istemcilerin sertifikayı sabitleyebilmesi için paylaşım bağlantılarına eklenir.", + "pinnedPeerCertSha256Placeholder": "onaltılık (hex) hash(ler), virgülle ayrılmış", "generateRandomPin": "Rastgele hash üret", "getNewEchCert": "Yeni ECH sertifikası al", "show": "Göster", diff --git a/web/translation/uk-UA.json b/web/translation/uk-UA.json index bfcaa821..207faf07 100644 --- a/web/translation/uk-UA.json +++ b/web/translation/uk-UA.json @@ -555,8 +555,8 @@ "echKey": "ECH key", "echConfig": "ECH config", "pinnedPeerCertSha256": "Закріплений SHA-256 сертифіката пира", - "pinnedPeerCertSha256Tip": "SHA-256-хеші сертифіката пира в кодуванні Base64. Лише панель — не записується в конфіг xray сервера, але додається до посилань спільного доступу, щоб клієнти могли закріпити сертифікат.", - "pinnedPeerCertSha256Placeholder": "Base64-хеш(і), через кому", + "pinnedPeerCertSha256Tip": "SHA-256-хеші сертифіката пира у вигляді шістнадцяткового рядка (напр. e8e2d3…), через кому. Лише панель — не записується в конфіг xray сервера, але додається до посилань спільного доступу, щоб клієнти могли закріпити сертифікат.", + "pinnedPeerCertSha256Placeholder": "шістнадцятковий хеш(і), через кому", "generateRandomPin": "Згенерувати випадковий хеш", "getNewEchCert": "Отримати новий ECH-сертифікат", "show": "Показати", diff --git a/web/translation/vi-VN.json b/web/translation/vi-VN.json index 9c24b6be..c3a77e56 100644 --- a/web/translation/vi-VN.json +++ b/web/translation/vi-VN.json @@ -555,8 +555,8 @@ "echKey": "ECH key", "echConfig": "Cấu hình ECH", "pinnedPeerCertSha256": "SHA-256 chứng chỉ peer đã ghim", - "pinnedPeerCertSha256Tip": "Hash SHA-256 mã hóa Base64 của chứng chỉ peer. Chỉ panel — không ghi vào cấu hình xray máy chủ, nhưng được đưa vào liên kết chia sẻ để client có thể ghim chứng chỉ.", - "pinnedPeerCertSha256Placeholder": "hash base64, phân tách bằng dấu phẩy", + "pinnedPeerCertSha256Tip": "Hash SHA-256 của chứng chỉ peer dưới dạng chuỗi thập lục phân (vd. e8e2d3…), phân tách bằng dấu phẩy. Chỉ panel — không ghi vào cấu hình xray máy chủ, nhưng được đưa vào liên kết chia sẻ để client có thể ghim chứng chỉ.", + "pinnedPeerCertSha256Placeholder": "hash thập lục phân, phân tách bằng dấu phẩy", "generateRandomPin": "Tạo hash ngẫu nhiên", "getNewEchCert": "Lấy chứng chỉ ECH mới", "show": "Hiện", diff --git a/web/translation/zh-CN.json b/web/translation/zh-CN.json index 6d5767cf..b95951ce 100644 --- a/web/translation/zh-CN.json +++ b/web/translation/zh-CN.json @@ -555,8 +555,8 @@ "echKey": "ECH key", "echConfig": "ECH 配置", "pinnedPeerCertSha256": "固定对端证书 SHA-256", - "pinnedPeerCertSha256Tip": "对端证书的 Base64 编码 SHA-256 哈希。仅面板使用 — 不写入服务器的 xray 配置,但会包含在分享链接中,以便客户端固定证书。", - "pinnedPeerCertSha256Placeholder": "base64 哈希,逗号分隔", + "pinnedPeerCertSha256Tip": "对端证书的 SHA-256 哈希(十六进制字符串,如 e8e2d3…),逗号分隔。仅面板使用 — 不写入服务器的 xray 配置,但会包含在分享链接中,以便客户端固定证书。", + "pinnedPeerCertSha256Placeholder": "十六进制哈希,逗号分隔", "generateRandomPin": "生成随机哈希", "getNewEchCert": "获取新 ECH 证书", "show": "显示", diff --git a/web/translation/zh-TW.json b/web/translation/zh-TW.json index 8a5bbed9..424cda61 100644 --- a/web/translation/zh-TW.json +++ b/web/translation/zh-TW.json @@ -555,8 +555,8 @@ "echKey": "ECH key", "echConfig": "ECH 設定", "pinnedPeerCertSha256": "釘選對端憑證 SHA-256", - "pinnedPeerCertSha256Tip": "對端憑證的 Base64 編碼 SHA-256 雜湊。僅面板使用 — 不寫入伺服器的 xray 設定,但會包含在分享連結中,以便用戶端釘選憑證。", - "pinnedPeerCertSha256Placeholder": "base64 雜湊,以逗號分隔", + "pinnedPeerCertSha256Tip": "對端憑證的 SHA-256 雜湊(十六進位字串,如 e8e2d3…),以逗號分隔。僅面板使用 — 不寫入伺服器的 xray 設定,但會包含在分享連結中,以便用戶端釘選憑證。", + "pinnedPeerCertSha256Placeholder": "十六進位雜湊,以逗號分隔", "generateRandomPin": "產生隨機雜湊", "getNewEchCert": "取得新 ECH 憑證", "show": "顯示",