SHA-256 ハッシュを Base64 で得る方法
- アルゴリズム では SHA-256 が選択されています。ほかのボタンで MD5、SHA-1、SHA-384、SHA-512 に切り替えられます。
- 入力 を テキスト にした状態で、テキスト 欄に入力するか貼り付けます。そのテキストをどう読むかは 入力の形式 で決まります。UTF-8 テキストとして読むほか、すでにエンコードされた形で手元にあるバイナリデータをハッシュしたい場合は、16進数や Base64 のバイト列として読むこともできます。
- 結果を Hex、Base64、Base64URL のいずれかでコピーします。すべてのアルゴリズム には、同じ入力に対するすべてのダイジェストが並びます。
- ファイルをハッシュするには、入力 を ファイル に切り替えて 1 つまたは複数のファイルをドロップします。ファイルごとに結果が表示されます。200 MB を超えると SHA-256 と MD5 は 8 MB 単位のチャンクで計算され、進捗が表示されるので、大きなファイルを一度にメモリに載せる必要はありません。
ハッシュは入力に合わせて更新されます。上部の HMAC と SRI で、鍵付きハッシュとサブリソース完全性(SRI)タグに切り替えられます。
ハッシュの例
| 入力 | SHA-256(16進数) | SHA-256(Base64) |
|---|---|---|
| 空文字列 | e3b0c442…7852b855 | 47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU= |
hello | 2cf24dba…938b9824 | LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ= |
hello + 改行 | 5891b5b5…46f6be03 | WJG1tSLV3whtD/CxEPvZ0hu0/HFjrzTQgoai6Eb2vgM= |
The quick brown fox jumps over the lazy dog | d7a8fbb3…37c9e592 | 16j7swfXgJRpypq8sAguT41WUeRtPNt2LQLQvzfJ5ZI= |
2 行目と 3 行目が、不一致のほとんどの原因になる落とし穴です。目に見えない改行 1 つで、ハッシュはまったく別物になります。また、ブラウザのテキストボックスに貼り付けたテキストは改行が LF に変換されるので、CRLF 改行のファイルは中身を貼り付けるのではなく、ファイルそのものをドロップしてください。
Base64 の SHA-256 が使われる場面
ダイジェストは伝統的に16進数で表示されますが、短く済むため Base64 を使う形式も多くあります。
- Content Security Policy のハッシュ(インラインスクリプト用):
script-src 'sha256-…'。 - サブリソース完全性(SRI):
integrity="sha256-…"。ただしこちらでは SHA-384 のほうが一般的です。 - HTTP の
Content-Digest(RFC 9530):本文{"hello": "world"}に対してはContent-Digest: sha-256=:X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=:となります。コロンは、構造化ヘッダーでバイナリ値を表す記号です。 - クラウドストレージのチェックサム:たとえば Amazon S3 の
x-amz-checksum-sha256ヘッダーは、Base64 のダイジェストを運びます。 - ロックファイルとパッケージマネージャー:
package-lock.jsonのintegrityフィールド(通常はsha512-…)や、Nix の SRI 形式のハッシュです。
Docker や OCI イメージのダイジェスト(sha256:…)と Git は16進数を使います。システム間で比較する必要がある場合は、ハッシュを計算し直すのではなく、16進数から Base64 や Base64 から16進数 で変換してください。
コードとコマンドラインでの SHA-256 Base64
printf 'hello' | openssl dgst -sha256 -binary | base64
sha256sum file.bin | cut -d' ' -f1 | xxd -r -p | base64
-binary を付けないと、OpenSSL は16進数のテキストを出力し、そのテキストを Base64 にすると 88 文字の意味のない文字列になります。
import base64, hashlib
digest = hashlib.sha256(b"hello").digest()
print(base64.b64encode(digest).decode())
Node.js では、crypto.createHash("sha256").update("hello").digest("base64") が同じ LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ= を返し、"base64url" を指定すれば URLセーフ形式になります。単なるハッシュは署名ではありません。誰でも計算し直せます。メッセージが鍵を持つ人から送られたことを証明するには HMAC を使ってください。詳しくは Python での Base64 と OpenSSL を参照してください。
よくある質問
SHA-256 の結果がコマンドラインと一致しないのはなぜですか?
ほとんどの場合、末尾の改行が原因です。echo hello は hello に \n を加えた 6 バイトを出力するので、hello のハッシュとは異なります。シェルでは printf 'hello' か echo -n hello を使うか、ファイルをここにドロップして比較してください。
SHA-256 ハッシュは Base64 で何文字ですか?
44 文字で、末尾に = が 1 つ付きます。パディングなしの Base64URL なら 43 文字、16進数なら 64 文字です。88 文字になった場合は、生のダイジェストではなく16進数のテキストを Base64 エンコードしています。
SHA-256 の16進数文字列を Base64 に変換できますか?
はい。ダイジェストのバイト列は同じです。64 桁の16進数を 16進数から Base64 に貼り付けるか、シェルで16進数を xxd -r -p に通して base64 にパイプしてください。
SHA-256 を元のテキストにデコードできますか?
できません。ハッシュは一方向の指紋なので、デコードするものがありません。Base64 をデコードしても得られるのは 32 バイトのダイジェストだけです。エンコードとの違いは Base64 は暗号化ではない を参照してください。