ハッシュ生成

貼り付けたものをハッシュにします。SHAはブラウザ自身の暗号実装を使い、MD5はその標準に入っていないのでここで直に実装しています — 安全でないという理由で外されたものですが、古いシステムと値を突き合わせる仕事は今も現実にあります。

入れたものは端末から出ません。 ブラウザの中だけで処理し、どこにも送らず保存もしません。

ハッシュがしていること

どれだけ長い文を入れても決まった長さの値が出ます。MD5 は16進数32文字、SHA-1 は40文字、SHA-256 は64文字、SHA-512 は128文字です。同じ入力からは必ず同じ値が出て、一文字違うだけで値全体が変わります。値から元の文には戻れないので、取得したファイルが壊れていないか、二つのデータが同じか、キャッシュのキーを何にするか、といった用途に使います。

SHA はブラウザが、MD5 は自前で

SHA 系は crypto.subtle.digest で求めます。ブラウザに組み込まれた機能なので正確で速いのですが、HTTPS か localhost でしか使えません。MD5 は標準から外れてブラウザが提供しないため、RFC 1321 の通りに自前で実装しました。古いシステムの値と突き合わせたい人のために残したもので、画面にも新規には使わないよう書いてあります。鍵を混ぜる HMAC はここにはありません。

ハッシュは文字ではなくバイトから出ます

入力を UTF-8 に変えたバイト列をハッシュします。同じ文字でも Shift_JIS や UTF-16 で保存したファイルとは値が違い、行末が \r\n の Windows のファイルと \n のファイルでも違います。ファイルの先頭に BOM の3バイトが付いていれば、それも値に入ります。よそで出した値と合わないときは、文字よりも先にこうしたバイトを疑ってください。

四つの値を一度に、小文字で

アルゴリズムは選びません。四つを一度に計算して並べるので、どれで作られた値か分からないときは長さを見比べれば済みます。値は小文字の16進数です。別のツールが大文字で出したなら文字の大小が違うだけで同じ値なので、大小を無視して比べてください。入れた文はそのままハッシュします。前後の空白も、貼り付けで付いてきた最後の改行も値に入ります。空白だけの入力は処理しません。

実装が正しいか確かめる方法

MD5 は自前で実装しているので疑って構いません。例に置いた abc は仕様書のテストベクタで、MD5 は 900150983cd24fb0d6963f7d28e17f72、SHA-256 は ba7816bf で始まり f20015ad で終わるはずです。他の実装と食い違うなら、まずそちらの入力に見えない文字が混ざっていないか確かめてください。

よくある質問

MD5やSHA-1を使ってよいですか

新しく作るものには使わないでください。どちらも衝突が示されており、同じハッシュになる別の入力を作れるということです。パスワードの保存にはハッシュではなく、bcryptやargon2のような専用の関数をお使いください。ここにあるのは、既にある値と突き合わせるためのものです。

ファイルのハッシュも取れますか

今は文章だけです。ファイルのチェックサムなら、OS自身のコマンド(shasum、certutil)のほうが速く済みます。

SHAでパスワードを保存できますか

できません。SHAは 速いように作られていて、今の機械は毎秒何十億回も試せます。パスワードには、わざと遅い関数 — bcrypt・scrypt・Argon2 — を、利用者ごとに違うソルトと併せて使ってください。

同じ文章なのにハッシュが違います

目に見えないところが違っています。末尾の改行一つ、空白一つで値が丸ごと変わります。ファイルのハッシュと比べているなら、お使いのエディタが保存時に改行を足していないかご確認ください。

HMAC やソルトは混ぜられますか?

できません。ソルトは文の前か後ろに自分で繋げて入れれば同じ値になりますが、HMAC は鍵を内外で二度混ぜて二度ハッシュする別の構造なので、繋げるだけでは作れません。署名を照合するなら、その言語の HMAC 関数を使ってください。

貼り付けたものはサーバへ送られますか

送られません。すべてブラウザの中で動き、送信も保存もしません。だからこそ、ふつうならウェブページに貼り付けない社内の設定ファイルや本番のクエリにも使えます。通信を切ったままでも動きます。