online toolsby kmmr.jp 36のツールを探す
online tools

SHA-256をBase64で表す方法

SHA-256の値をBase64にしたのに、APIや別のツールの結果と一致しない。そんなときは、32バイトのハッシュ値を変換したのか、64文字のhexを文字列として変換したのかを見ると原因を絞れます。

ハッシュ計算ツールで例を試す

同じabcから作った3つの表現を比べる

入力は改行なしのabc、文字コードはUTF-8、HMAC鍵は使いません。SHA-256が返すハッシュ値は256ビット=32バイトです。hexはその値を16進数で書いた表現、Base64は同じバイト列を別の文字で書いた表現です。

ハッシュ値のhex表現 64文字
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
ハッシュ値32バイトのBase64 44文字(末尾の = を含む)
ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0=
hexの64文字を文字列としてBase64にした値 88文字(別の値)
YmE3ODE2YmY4ZjAxY2ZlYTQxNDE0MGRlNWRhZTIyMjNiMDAzNjFhMzk2MTc3YTljYjQxMGZmNjFmMjAwMTVhZA==

Base64は暗号化ではなく、バイト列の表現方法です。2つ目の値をBase64デコードすると戻るのは32バイトのハッシュ値で、元のabcではありません。APIが「SHA-256のBase64」を要求する場合は、どのバイト列を符号化する仕様なのかを確認すると取り違えを防げます。

Pythonでdigestのバイト列を変換する

digest()はバイト列、hexdigest()はhexの文字列を返します。Base64へ渡すのはdigest()の結果です。最後の行は、比較用にhex文字列を符号化しています。出力は上の3つと同じ順になります。

import base64
import hashlib

message = "abc".encode("utf-8")
digest = hashlib.sha256(message).digest()
hex_text = digest.hex()

print(hex_text)
print(base64.b64encode(digest).decode("ascii"))
print(base64.b64encode(hex_text.encode("ascii")).decode("ascii"))

手元にhexだけがある場合はバイト列へ戻す

64文字のSHA-256 hex値からBase64へ変換するときは、先にbytes.fromhex()で32バイトへ戻します。hexの文字列をもう一度SHA-256にかける操作も、元のハッシュ値の表現変換とは別の計算になります。

import base64

hex_text = "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
digest = bytes.fromhex(hex_text)
if len(digest) != 32:
    raise ValueError("Expected a 32-byte SHA-256 digest")
print(base64.b64encode(digest).decode("ascii"))

この例はhexのバイト区切りの空白を許容しますが、16進数でない文字や奇数桁の値はValueErrorになります。読み取れたバイト数が32でない場合も止まります。文字数や見た目だけでSHA-256値と決めず、生成元の方式と照合してください。

ハッシュ計算ツールで同じ結果を確かめる

  1. 入力欄にabcを入力します。末尾に改行や空白を加えず、ファイルは選びません。
  2. アルゴリズムはSHA-256だけを選び、HMACのシークレットキーは空欄にします。
  3. 「Base64形式で表示」を選び、「ハッシュを生成」を押すと、ungWv48Bz+で始まる44文字になります。
  4. Base64の選択を外してもう一度生成すると、ba7816bfで始まる64文字のhexになります。

この手順のSHA-256計算はブラウザ内で行います。SHA-512/256・SHA3-256・SHA3-512・BLAKE2bも選ぶと、本文と入力したHMAC鍵をサーバーへ送信します。ファイルを選ぶ機能はUTF-8テキストとして読むため、画像やZIPなどの元バイトのハッシュ照合には使えません。

ハッシュ計算ツールで例を試す

一致しないときは入力と出力形式を照合する

改行・空白
abc、abcの後にLFを付けた値、CRLFを付けた値は異なるバイト列です。コマンドやエディターが末尾へ加えた改行も計算に含まれます。
文字コード・BOM
同じ見た目の文字でもUTF-8とUTF-16ではバイト列が違います。元データにBOMがある場合、計算に含めるか除くかもそろえる必要があります。ファイルの元バイトを比べるときは、テキストへ読み替えずバイナリとして計算します。
SHA-256とHMAC-SHA-256
鍵を使うHMACは通常のSHA-256とは別の計算です。HMACが必要な仕様では、メッセージだけでなく鍵のバイト列も一致させます。
標準Base64とBase64url
Base64urlでは標準Base64の + と / の代わりに - と _ を使います。末尾の = を省くかどうかは利用する仕様に合わせます。このツールのBase64表示は標準Base64で、例の末尾には = が1つ付きます。

仕様とAPIの出典

ガイド一覧

このツールが便利だと思ったら、SNSでシェアしていただけると嬉しいです!


このサイトを運営する為に、広告を掲載しています。見づらいかもしれませんが、ご理解いただけると幸いです。