SHA-1ハッシュジェネレーター
任意のテキストからSHA-1ハッシュを生成
入力テキスト
SHA-1ハッシュ
SHA-1ハッシュがここに表示されます…
SHA-1ハッシングとは?
SHA-1(Secure Hash Algorithm 1)は、任意の入力から固定長160ビット(20バイト)のダイジェストを生成する暗号ハッシュ関数です。NSAが開発し、1995年にNISTがFIPS PUB 180-1として標準化、後にRFC 3174として文書化されました。SHA-0とMD5の後継としてより強固な設計が施されており、入力を512ビットブロック単位に分割し80ラウンドのビット演算で処理することで、40文字の16進数フィンガープリントを生成します。10年以上にわたりSSL/TLS、PGP、SSH、IPsecの基盤として機能してきたアルゴリズムです。
すべての暗号ハッシュ関数と同様に、SHA-1は一方向変換です。入力からハッシュを計算するのは高速ですが、ハッシュ単体から入力を復元することは計算上不可能です。入力の1ビットを変えると160ビットのダイジェスト全体が完全に変わります。これを「アバランシェ効果」と呼びます。SHA-1は任意の大きさの入力空間を固定の160ビット出力にマッピングするため、数学的にはコリジョン(異なる2つの入力が同じハッシュを生成する状況)が必ず存在します。ハッシュ関数のセキュリティ上の主張は、コリジョンを見つけるために約2^80回の演算が必要であるというものです。これは出力ビット長の半分に相当します。
2017年、GoogleとCWI AmsterdamがSHAttered攻撃を公表しました。同一ダイジェストを持つ異なる2つのPDFファイルを生成することで、初の実用的なSHA-1コリジョンを実証したものです。この攻撃には約2^63.1回のSHA-1計算が必要で、理論上の2^80を大きく下回りました。2020年にはGaetan LeurentとThomas Peyrinが選択プレフィックスコリジョン攻撃を発表し、必要な計算量を約2^63.4まで削減しました。これを受け、主要ブラウザ・認証局・標準化団体はすべてデジタル署名とTLS証明書においてSHA-1を非推奨としました。ただし、セキュリティ以外の用途では依然として使われています。GitのオブジェクトID(SHA-256への移行中ではありますが)、レガシーHMAC構成、敵対的なコリジョン耐性を必要としないファイル整合性チェックなどがその例です。
このSHA-1ジェネレーターを使う理由
インストールやコード記述なしに、SHA-1ハッシュを即座に生成できます。テキストを貼り付けるだけでリアルタイムに40文字の16進数ダイジェストを取得できます。レガシーチェックサムの検証、Gitの内部動作のデバッグ、ハッシュベースのワークフローのテストに役立ちます。
SHA-1の活用例
SHA-1と他のハッシュアルゴリズムの比較
SHA-1は160ビットのダイジェストを生成します。MD5(128ビット)より長いですが、SHA-2ファミリーのアルゴリズムより大幅に短いです。以下の表は各アルゴリズムのダイジェストサイズ、標準規格、適切なユースケースを比較しています。
| アルゴリズム | ダイジェストサイズ | 16進数長 | 標準規格 | 最適用途 |
|---|---|---|---|---|
| SHA-1 | 160 bits | 40 hex chars | 1995 / RFC 3174 | Deprecated — legacy git commits, old TLS |
| SHA-256 | 256 bits | 64 hex chars | 2001 / FIPS 180-4 | TLS certificates, blockchain, JWTs |
| SHA-384 | 384 bits | 96 hex chars | 2001 / FIPS 180-4 | Government systems, higher security margin |
| SHA-512 | 512 bits | 128 hex chars | 2001 / FIPS 180-4 | Digital signatures, HMAC with large keys |
| MD5 | 128 bits | 32 hex chars | 1992 / RFC 1321 | Checksums only — broken since 2004 |
| SHA-3 | 256 bits | 64 hex chars | 2015 / FIPS 202 | Post-quantum readiness, alternative to SHA-2 |
| BLAKE3 | 256 bits | 64 hex chars | 2020 | High-performance checksums, Merkle trees |
SHA-1の仕組み
SHA-1はMerkle-Damgard構成に従います。メッセージはパディングされ512ビットブロックに分割され、各ブロックはそのブロックから導出されたメッセージスケジュールと入力を混合する80ラウンドのビット演算で処理されます。5つの32ビット状態語(H0からH4)が実行中のハッシュ状態を保持し、これらの語を最終的に連結したものが160ビットのダイジェストとなります。
SHA-1: 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
(160 bits = 20 bytes = 40 hex characters)
| ステップ | 説明 |
|---|---|
| Padding | Append a 1-bit, then zeros, until message length is 448 mod 512. Append the original length as a 64-bit big-endian integer. |
| Block splitting | Divide the padded message into 512-bit (64-byte) blocks. |
| Expansion | Expand each 16-word block into 80 words using a left-rotate-by-1 XOR feedback schedule. |
| Compression | Process 80 rounds per block using four nonlinear functions (Ch, Parity, Maj, Parity) across rounds 0-19, 20-39, 40-59, and 60-79. |
| Output | Concatenate the five 32-bit state words (H0-H4) into a 160-bit (20-byte) digest, rendered as 40 hexadecimal characters. |
SHA-1とMD5の主な違いは、状態語の数(5対4)、ブロックあたりのラウンド数(80対64)、および左ローテートフィードバックを持つメッセージスケジュールの使用です。これらの違いにより、SHA-1はMD5より大きな出力(160対128ビット)を持ち、元々より高いセキュリティマージンを提供していましたが、両アルゴリズムとも現在はコリジョン耐性が破られているとみなされています。
コード例
主要な言語と環境でSHA-1ハッシュを生成する方法を示します。MD5とは異なり、SHA-1はブラウザのWeb Crypto APIで利用可能なため、ブラウザとNode.js環境の両方で外部ライブラリなしに使用できます。
// SHA-1 is available in the Web Crypto API
async function sha1(text) {
const data = new TextEncoder().encode(text)
const hashBuffer = await crypto.subtle.digest('SHA-1', data)
const hashArray = Array.from(new Uint8Array(hashBuffer))
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')
}
await sha1('hello world')
// → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
// Node.js (built-in crypto module)
const crypto = require('crypto')
crypto.createHash('sha1').update('hello world').digest('hex')
// → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"import hashlib
# Basic SHA-1 hash
result = hashlib.sha1(b'hello world').hexdigest()
print(result) # → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
# Hash a string (encode to bytes first)
text = 'hello world'
hashlib.sha1(text.encode('utf-8')).hexdigest()
# → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
# Hash a file in chunks
with open('file.bin', 'rb') as f:
sha1 = hashlib.sha1()
for chunk in iter(lambda: f.read(8192), b''):
sha1.update(chunk)
print(sha1.hexdigest())package main
import (
"crypto/sha1"
"fmt"
)
func main() {
data := []byte("hello world")
hash := sha1.Sum(data)
fmt.Printf("%x\n", hash)
// → 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
}# Using sha1sum (Linux) or shasum (macOS) echo -n "hello world" | sha1sum # → 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed - # macOS echo -n "hello world" | shasum -a 1 # → 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed - # Hash a file sha1sum package.json # → a1b2c3d4e5f6... package.json # Using openssl (cross-platform) echo -n "hello world" | openssl sha1 # → SHA1(stdin)= 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed