Base64 は機密性を提供しません。エンコードされた値を受け取った人は誰でも、パスワードやキーを使わずにそのバイトを復元できます。長い文字列で資格情報を非表示にすると、その外観が変わりますが、誰が読み取れるかは変わりません。エンコードされたシークレットには、元のシークレットと同じ処理ルールを適用します。
エンコーディング、暗号化、署名はさまざまな質問に答えます
エンコーディングでは、バイトがテキスト指向のシステムをどのように通過できるかが問われます。暗号化は、暗号キーに基づいて機密性を保護します。認証タグまたはデジタル署名は、検証プロセスとキーが正しい場合、データが権限のある当事者によって作成され、変更されていないことを証明できます。単純なチェックサムは主に、偶発的な破損を検出するのに役立ちます。これらの保証はいずれも、Base64 だけから得られるものではありません。
デコードされた JWT は有用な例です。そのヘッダーとペイロードは読み取り可能な構造ですが、これらを読み取っても、署名、発行者、対象者、または有効期限ポリシーは検証されません。未検証のクレームを信頼できない入力として扱います。ビューアのフォーマットされた JSON が承認の決定にならないようにしてください。
デコードされたコンテンツを不活性に保つ
デコード結果が HTML、JavaScript、実行可能な内容を含む SVG、または不正な形式の文書になることがあります。テキストの表示には textContentを使用し、次のものは使用しないでください: innerHTML。デコードしたコードを実行したり、任意の SVG をページに挿入したりしないでください。Data URI に記載された MIME タイプは送信者が指定するため、実際の内容と異なる場合があります。ファイルシグネチャは形式の推定に役立ちますが、ヘッダーが一致しても、ファイルが完全で安全だとは限りません。
// decodedText comes from an untrusted payload.
const output = document.createElement('pre');
output.textContent = decodedText;
document.body.append(output); // displays markup as text
メモリを割り当てる前に制限を設定する
エンコードされたテキストはデータを拡張し、ブラウザーは入力文字列、デコードされたバイト、およびプレビューを同時に保持できます。デコードする前に制限を適用し、受け入れられるドキュメントの種類を制限し、ユーザーが長時間の操作をキャンセルできるようにします。不正な入力は、成功したデータであるかのようにコピーできる出力ではなく、別のエラー状態を生成する必要があります。
機密情報を扱う場合は、ツールの通信内容とデータ保持方針を確認してください。ブラウザ内の処理とサーバーの API 処理では、データが渡される範囲が異なります。トークンをページの URL に含めると、ブラウザの履歴、スクリーンショット、アクセスログなどに残る可能性があります。テストには、実データと同じ構造の架空のデータを使ってください。 RFC 4648 エンコーディングの曖昧さについて説明します。より大規模なプロトコルのセキュリティは、依然としてその完全な設計に依存します。