どの鍵・ハッシュツールを使えばよいか
| やりたいこと | ツール |
|---|---|
| 証明書の名前、有効期限、フィンガープリントを読む | 証明書デコーダー |
| CA に送る前に CSR を確認する | CSR デコーダー |
| テキストの PEM とバイナリの DER を相互変換する | PEM から DER へ、DER から PEM へ |
| SSH 公開鍵のフィンガープリントを求める、形式を変換する | SSH 鍵フィンガープリント |
| テキストやファイルの SHA-256 を 16進数と Base64 で求める | SHA-256 を Base64 で |
| Content-MD5 や従来のチェックサム | MD5 を Base64 で |
| Webhook や API リクエストに署名する | HMAC 生成ツール |
スクリプトやスタイルシート用の integrity="sha384-…" | SRI ハッシュ生成ツール |
| 任意の長さのランダムな Base64 文字列 | ランダム Base64 生成ツール |
Laravel の APP_KEY、AES 鍵、JWT や HMAC のシークレット | Base64 鍵生成ツール |
| Content Security Policy の nonce | CSP nonce 生成ツール |
| パスワードでテキストを暗号化・復号する | AES 暗号化、AES 復号 |
Base64 と暗号技術が交わる場所
PEM は、DER でエンコードした ASN.1 を Base64 にして -----BEGIN …----- 行で挟んだものです。証明書、CSR、公開鍵、秘密鍵のどれもこれを使います。Base64 の DER は、ほとんどの証明書と RSA 鍵では MII、EC P-256 の公開鍵では MFkw、Ed25519 の公開鍵では MCowBQYDK2Vw で始まるので、デコードする前から種類がわかることがよくあります。
SSH 鍵 は別の構造を使います。ssh-ed25519 の行の AAAAC3NzaC1lZDI1NTE5… の部分は鍵のブロブを Base64 にしたもので、おなじみの SHA256:… フィンガープリントは、そのブロブのハッシュをパディングなしの Base64 にしたものです。
ハッシュ は生のバイト列です。テキスト hello の SHA-256 は 32 バイトで、16進数 64 文字なら 2cf24dba…9824、Base64 44 文字なら LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ= です。Webhook の署名、SRI 属性、S3 の Content-MD5 ヘッダーは Base64 の形式を前提としており、それを 16進数のダイジェストと比べてしまうのが「signature mismatch」エラーのよくある原因です。
設定ファイルの ランダムなシークレット は、openssl rand -base64 32 のように、ランダムな 32 バイトを Base64 にしたものが一般的です。鍵生成ツールは、主要なフレームワーク向けのプリセット付きで同じ形式を生成します。
これらのツールでできないこと
- 証明書チェーンの検証や失効の確認はしません。ページは設計上、他のサーバーに接続できません。
- 秘密鍵の中身は表示しません。証明書ツールは秘密鍵の種類とサイズだけを示し、SSH ツールは秘密鍵ファイルのうち公開部分だけを読みます。
- MD5 と SHA-1 は既存システムとの互換性のために用意しています。新しいセキュリティ設計には使わないでください。
JWT の署名と検証については Web・トークンツール をご覧ください。こうした Base64 がそれだけでは秘密にならない理由は、エンコードと暗号化の違い で説明しています。
よくある質問
ハッシュや鍵が Base64 で書かれることが多いのはなぜですか?
16進数より短いからです。SHA-256 ハッシュは 16進数なら 64 文字ですが Base64 なら 44 文字で、32 バイトの鍵も 64 文字ではなく 44 文字の Base64 で済みます。SRI 属性、SSH フィンガープリント、HMAC 署名、.env のシークレットの多くが Base64 を使うのはこのためです。
Base64 は暗号化の一種ですか?
いいえ。Base64 は誰でも元に戻せます。PEM 形式の秘密鍵は鍵のバイト列を Base64 にしただけのもので、だからこそファイル自体を保護する必要があります。AES ツール のような本物の暗号化は、元に戻すのに鍵やパスワードが必要です。
生成されるランダムな鍵は安全ですか?
ブラウザの crypto.getRandomValues から生成しています。WebCrypto が鍵の生成に使うのと同じ、暗号論的に安全な乱数源です。何も保存も送信もされないので、各値はコピーするまで画面上にしか存在しません。