コンテンツへスキップ
uencoder

メモリ上の機密データを安全に消去する

暗号鍵や平文は、使用後にメモリからゼロクリアしなければなりません。memset では不十分な理由と、コンパイラ最適化を防ぐ方法を学びましょう。

  1. 1

    暗号鍵や平文を使った後は、メモリ内でゼロで上書きしなければなりません。変数をスコープ外にするだけでは不十分です。データはページが再利用されるまでメモリに残ります。課題:鍵が二度と読まれない場合、コンパイラーは memset(key, 0, len) を最適化で削除します。

  2. 2
    ハッシュ計算ツール →

    非可逆な表現を保持する必要がある場合は、処理前に機密データをハッシュします。メモリ内では、ハッシュ出力が平文を置き換えます。元のデータはハッシュ後にワイプされます。

  3. 3
    Base64 エンコーダー →

    送信用に機密データをエンコードしてから、元の平文をメモリからワイプします。エンコードされた形はシークレットではなく、転送表現です。使用後は両方をワイプしてください。

  4. 4

    C/C++ では、explicit_bzero() か volatile ポインターを使い、コンパイラーがゼロ化を最適化で削除するのを防ぎます。JavaScript では、言語がメモリのゼロ化を保証しません。Uint8Array を使ってすべてのバイトを上書きしてください。ただし、GC がすぐにメモリを回収しない場合があることに注意してください。本当に機密性の高い操作には、Web Worker を使って、使用後に終了させてください。

よくある質問

コンパイラーはなぜ memset を最適化で削除するのですか?
コンパイラーが、memset(buf, 0, len) の後でバッファが二度と読まれないと判断すると、ゼロ化を「デッドストア」とみなし、パフォーマンスのために削除します。explicit_bzero のような関数は、volatile セマンティクスでこの最適化を防ぎます。
これは JavaScript でも関係ありますか?
はい。JavaScript の文字列は不変でゼロ化できません。シークレットを文字列で保存しないでください。Uint8Array(可変)を使い、すべてのバイトを上書きします。ただし、GC はコンパクション中にデータをコピーし、メモリにコピーを残す可能性があります。最大のセキュリティのために、Worker を使って終了させるか、手動メモリ管理の WASM を使ってください。

このタスクを解決するワークフロー

Ascii85 から Base64 へ変換
Ascii85 をデコードし、より広い互換性のために Base64 として再エンコードする。
パイプライン
Base2048 から Base64 へ変換
Base2048(絵文字)をデコードし、標準転送のために Base64 として再エンコードする。
パイプライン
Base32 から Base64 へ変換
Base32 エンコード文字列を生バイトにデコードし、よりコンパクトな表現のために Base64 として再エンコードする。
パイプライン
Base58 から Base64 へ変換
Base58 をデコードし、標準互換性のために Base64 として再エンコードする。
パイプライン
Base64 エンコード後デコードのラウンドトリップ検証
テキストを Base64 にエンコードし、デコードしてラウンドトリップが元のデータを保持することを検証する。
パイプライン
Blowfish 暗号化後に Base64 エンコード
Blowfish で暗号化し、テキストセーフな転送のために Base64 エンコードする。
パイプライン
DES 暗号化後に Base64 エンコード
DES で暗号化し、レガシー互換性のために Base64 エンコードする。
パイプライン
URL 転送用の JSON ペイロードのエンコード
JSON ドキュメントを URL パラメータ用に準備する: 整形、Base64 エンコード、パーセントエンコード — ネストされたパラメータデコードチェーンの正確な逆順。
パイプライン
AES 暗号化後に Base64 エンコード
平文を AES で暗号化し、テキストセーフな転送のために暗号文を Base64 としてエンコードする。
パイプライン
コンテンツのハッシュと Base64 エンコード
入力のハッシュを計算し、コンパクトな転送のためにハッシュダイジェストを Base64 としてエンコードする。
パイプライン
テキストのハッシュと整合性検証
入力テキストのハッシュを計算し、期待されるハッシュと比較して整合性を検証する。
パイプライン
テキストのハッシュと CRC32 チェックサム検証
データ整合性検証のために、暗号学的 SHA-256 ハッシュと CRC32 チェックサムの両方を計算する。
パイプライン
Hex から Base64 へ変換
Hex 文字列を生バイトにデコードし、コンパクトな転送のために Base64 として再エンコードする。
パイプライン
HMAC 署名後に Base64 エンコード
HMAC 署名を生成し、API 認証ヘッダーのために Base64 エンコードする。
パイプライン
MD5 ハッシュ後に Base58 エンコード
MD5 ハッシュを計算し、コンパクトな表現のために Base58 としてエンコードする。
パイプライン
Morse エンコードと Base64 転送
テキストを Morse 符号としてエンコードし、デジタル転送のために Base64 エンコードする。
パイプライン
マルチハッシュ速度比較
入力をハッシュし、複数のハッシュアルゴリズムをベンチマークして速度と出力を比較する。
パイプライン
パスワード生成とハッシュ
ランダムパスワードを生成し、安全な保存のためにハッシュする。
パイプライン
RC4 暗号化後に Base64 エンコード
RC4 で暗号化し、転送のために Base64 エンコードする。
パイプライン
RIPEMD-160 ハッシュ後に Base64 エンコード
RIPEMD-160 ハッシュを計算し、転送のために Base64 エンコードする。
パイプライン
SHA3-256 ハッシュと CRC32 チェックサム
SHA3-256 ハッシュを計算し、二重整合性検証のために CRC32 チェックサムを計算する。
パイプライン
SHA-512 ハッシュ後に Hex エンコード
SHA-512 ハッシュを計算し、可読性のために Hex としてエンコードする。
パイプライン
テキスト反転とハッシュ
テキストを反転し、その後反転結果の SHA-256 ハッシュを計算する。
パイプライン
テキストスクランブルとハッシュ
テキストをスクランブルし、その後スクランブル結果をハッシュする。
パイプライン
テキストシャッフルと Base64 エンコード
テキスト文字をシャッフルし、その後結果を Base64 エンコードする。
パイプライン
Unicode エスケープと Base64 エンコード
テキストを Unicode エスケープし、ASCII セーフな転送のために Base64 エンコードする。
パイプライン
URL エンコード後 Base64 二重エンコード
URL エンコードし、API ペイロードの二重エンコードのために Base64 エンコードする。
パイプライン
UUencode 後 Base64 エンコード
テキストを UUencode し、その後結果を Base64 エンコードして二重エンコードする。
パイプライン
UUID 生成と Base64 エンコード
UUID を生成し、コンパクトな保存のために Base64 エンコードする。
パイプライン

関連ツール