SHA-1 ハッシュ値生成ツール

テキスト、16進数のバイト列、ファイルの 160 ビット SHA-1 ダイジェストを、入力と同時に計算します。公開されているチェックサムと照合でき、同じ入力の SHA-256、SHA-512、MD5 もひと目で確認できます。

すべてのアルゴリズム

すべてブラウザ内で処理され、データはアップロードされません。

使い方

  1. テキストを入力するか、「入力形式」を「16進数」に切り替えてバイト列を入力するか、「ファイルを開く」でファイルを選びます。
  2. SHA-1 はあらかじめ選択されています。別のハッシュ関数と比べたい場合は「アルゴリズム」を変更します。
  3. 「出力形式」で「16進数(小文字)」(sha1sum や Git の表示形式)、「16進数(大文字)」、「Base64」のいずれかを選びます。
  4. 期待する SHA-1 を「比較対象」欄に貼り付けると、「一致」または「不一致」が表示されます。

SHA-1 とは

SHA-1(Secure Hash Algorithm 1)は NSA が設計したハッシュ関数で、短命に終わった SHA-0 に代わるものとして、1995 年に NIST が FIPS 180-1 として公開しました。現在は FIPS 180-4 で規定されており、RFC 3174 では C 言語のサンプルコード付きで解説されています。SHA-1 は 512 ビットのブロックを 80 ラウンドで処理し、160 ビットのダイジェストを出力します。16進数では 40 文字、Base64 では 28 文字です。

ほかのハッシュ関数と同様、SHA-1 は一方向です。ダイジェストは復号できず、推測した値をハッシュ化して一致するものを探すことしかできません。2012 年に LinkedIn から流出した、ソルトなしの SHA-1 でハッシュ化されたパスワードが大量に解読されたのも、この方法によるものです。パスワードは Argon2、scrypt、bcrypt、PBKDF2 で保存すべきです。

SHAttered:SHA-1 が非推奨になった理由

2017 年 2 月、CWI アムステルダムと Google の研究者が、初めての現実の SHA-1 衝突である SHAttered を発表しました。同じハッシュ値を持つ 2 つの異なる PDF ファイルで、約 2^63 回の SHA-1 計算によって発見されたものです。2020 年には Gaëtan Leurent と Thomas Peyrin が「SHA-1 is a Shambles」で選択プレフィックス衝突を用い、PGP 鍵に対する SHA-1 署名の偽造を実証しました。そのコストは、資金力のある攻撃者なら十分に手の届く範囲でした。

  • パブリック CA は 2016 年に SHA-1 の TLS 証明書の発行を停止し、ブラウザは 2017 年初めにそれらの証明書を信頼しなくなりました。
  • NIST は 2013 年以降、新しいデジタル署名への SHA-1 の使用を認めておらず、2030 年末までに完全に廃止する予定です。
  • ほとんどの Git リポジトリは、現在もオブジェクトを SHA-1 で識別しています。ただし、衝突の試みを検出する強化された実装で計算されており、Git では SHA-256 を使うリポジトリも作成できます。

衝突によって HMAC が破られるわけではないため、HMAC-SHA1 は TOTP コードや古い Webhook の署名で今も使われています。HMAC-SHA1 は HMAC 生成ツールで計算できます。新しく採用するなら SHA-256 を選んでください。

Git のオブジェクト ID、Base64、文字コード

Git の blob ID は、ファイルの内容だけの SHA-1 ではありません。Git は、blob、スペース、バイト単位のサイズ、ゼロバイトからなるヘッダーの後に内容を続けたものをハッシュ化します。これをこのページで再現するには、「入力形式」を「16進数」に切り替え、ヘッダーのバイト列も含めて入力します。hello と改行の場合、16進数の入力は 626c6f6220360068656c6c6f0a です。

$ printf 'hello\n' | sha1sum
f572d396fae9206628714fb2ce00f72e94f2258f  -
$ printf 'hello\n' | git hash-object --stdin
ce013625030ba8dba906f756967f9e9ca394464a

SHA-1 は通常、小文字の16進数で表示されます。Base64 が使われる例としては、WebSocket のハンドシェイク(Sec-WebSocket-Accept は、クライアントの鍵に固定の GUID を連結したものの SHA-1 を Base64 にした値です)や、LDAP の {SHA} 形式のパスワード値があります。ハッシュ値はバイト列に対して計算されることにも注意してください。アクセント付きの文字を含むテキストは、UTF-8 と Windows-1252 とで SHA-1 が異なります。

コマンドラインとコードで SHA-1 を計算する

sha1sum file.zip                          # Linux
shasum file.zip                           # macOS(既定のアルゴリズムは SHA-1)
certutil -hashfile file.zip SHA1          # Windows
Get-FileHash file.zip -Algorithm SHA1     # PowerShell

# Python
hashlib.sha1(data).hexdigest()

// Node.js
crypto.createHash('sha1').update(data).digest('hex')

このページでは、ブラウザに組み込まれた Web Crypto API で SHA-1 を計算するため、入力がデバイスの外に出ることはありません。「すべてのアルゴリズム」の表には、同じ入力の MD5、SHA-256、SHA-384、SHA-512、CRC の値が表示されます。

エンコード例

入力 (UTF-8)SHA-1
Hello, World!0a0a9f2a6772942557ab5355d76af442f8f65e01
Base64.is6c667ee2efd2020349eed40efa07c26683f613c8
你好440ee0853ad1e99f962b63e459ef992d7c211722

よくある質問

SHA-1 は今でも安全に使えますか?

署名や証明書など、攻撃者が入力を選んだり操作したりできる場面では安全ではありません。SHA-1 の衝突は作り出せるからです。偶発的な破損の検出には今でも使え、HMAC-SHA1 は衝突の影響を受けません。新しく使うなら SHA-256 か SHA-512 を選んでください。

SHA-1 のハッシュ値は元に戻せますか?

いいえ。鍵もなければ復号もありません。逆引きサイトが見つけられるのは、よく使われる単語や流出したパスワードの表にすでにある入力だけです。そのため、長いランダムな入力なら見つかりませんが、短いパスワードは見つかってしまいます。

SHA-1 のハッシュ値の長さはどれくらいですか?
160 ビット、つまり 20 バイトです。16進数では 40 文字、Base64 では = 1 つで終わる 28 文字になります。RIPEMD-160 も同じ長さで、MySQL 4.1 以降のパスワードハッシュはアスタリスクに続く16進数 40 文字です。ハッシュ識別ツールでは、入力した文字列に当てはまる候補を一覧表示できます。
公開されている SHA-1 とファイルを照合するにはどうすればよいですか?

「ファイルを開く」でファイルを読み込み、公開されている値を「比較対象」欄に貼り付けます。16進数は大文字・小文字のどちらでもよく、Base64 も使えます。結果は「一致」または「不一致」で表示されます。

SHA-1 と SHA-256 の違いは何ですか?

どちらも NIST が公開したものですが、SHA-256 は新しい SHA-2 ファミリーに属し、出力は 256 ビットで、実用的な攻撃は知られていません。SHA-1 は出力が短く、衝突耐性はすでに破られています。