SHA-384ハッシュジェネレーター
任意のテキストからSHA-384ハッシュを生成
入力テキスト
SHA-384ハッシュ
SHA-384ハッシュがここに表示されます…
SHA-384ハッシュとは何か
SHA-384は、NIST FIPS 180-4でSHA-2ファミリーの一部として定義された暗号学的ハッシュ関数です。任意の長さの入力を受け取り、固定長384ビット(48バイト)のメッセージダイジェストを生成し、通常は96桁の16進数文字列として表示されます。SHA-384は、TLS暗号スイート、デジタル証明書署名、およびSHA-256よりも高い衝突耐性マージンを必要とする政府システムで広く利用されています。
内部的には、SHA-384はSHA-512を切り詰めた変種です。SHA-512と同じ1024ビットのブロックサイズ、80回の圧縮ラウンド、64ビットワード演算を使用しますが、異なる初期ハッシュ値(第9番目から第16番目の素数から導出)で開始し、最終状態の最初の384ビットのみを出力します。この切り詰めにより、SHA-384は同一の入力に対してSHA-512とは異なるダイジェストを生成します(コアアルゴリズムは共有しているにもかかわらず)。
SHA-384は64ビットワードで動作するため、現代の64ビットプロセッサ上でSHA-256よりも高速に動作しつつ、より大きなダイジェストを提供します。これにより実用的な中間点となっています:SHA-256よりも強力(衝突耐性192ビット対128ビット)でありながら、SHA-512の128桁の16進数出力に伴うストレージオーバーヘッドもありません。SHA-384はTLS 1.3の証明書検証署名の既定ハッシュであり、NSA Suite B(現CNSA)では最高機密データに対して要求されています。
オンラインSHA-384生成ツールを使う理由
SHA-384ハッシュの生成には通常、ターミナルコマンドかコードの記述が必要です。このブラウザベースのツールを使えば、何もインストールせず、サーバーにデータを送信することなくSHA-384ダイジェストを即座に計算できます。
SHA-384ハッシュジェネレーターの利用シーン
SHA-2ファミリーの変種比較
SHA-384は他のいくつかの変種とともにSHA-2ファミリーに属しています。以下の表では、ダイジェストサイズ、出力長、および代表的な用途においてそれぞれがどのように異なるかを示しています。
| 変種 | ダイジェスト | 16進数の長さ | バイト数 | 主な用途 |
|---|---|---|---|---|
| SHA-384 | 384 bits | 96 hex chars | 48 bytes | TLS 1.2/1.3, government/CNSA, certificate signatures |
| SHA-256 | 256 bits | 64 hex chars | 32 bytes | TLS, blockchain, code signing, JWTs, SRI |
| SHA-512 | 512 bits | 128 hex chars | 64 bytes | Digital signatures, HMAC with large keys |
| SHA-224 | 224 bits | 56 hex chars | 28 bytes | Truncated SHA-256 — rare, specific compliance |
| SHA-512/256 | 256 bits | 64 hex chars | 32 bytes | SHA-512 speed on 64-bit CPUs, 256-bit output |
SHA-384 対 SHA-256 対 SHA-512 対 SHA-3-384
SHA-384と他のハッシュアルゴリズムの選択は、セキュリティ要件、プラットフォームの制約、および性能ニーズによって決まります。この比較では最も重要な特性を取り上げます。
| 特性 | SHA-384 | SHA-256 | SHA-512 | SHA-3-384 |
|---|---|---|---|---|
| Digest size | 384 bits (96 hex) | 256 bits (64 hex) | 512 bits (128 hex) | 384 bits (96 hex) |
| Internal state | 512 bits (8x64-bit) | 256 bits (8x32-bit) | 512 bits (8x64-bit) | 1600 bits (sponge) |
| Block size | 1024 bits | 512 bits | 1024 bits | 832 bits |
| Rounds | 80 | 64 | 80 | 24 |
| Word size | 64 bits | 32 bits | 64 bits | N/A (sponge) |
| Length extension | Resistant | Vulnerable | Vulnerable | Resistant |
| 64-bit performance | Fast (native ops) | Slower (32-bit ops) | Fast (native ops) | Moderate |
| Standard | FIPS 180-4 | FIPS 180-4 | FIPS 180-4 | FIPS 202 |
| Web Crypto API | Yes | Yes | Yes | No |
SHA-384の内部動作
SHA-384はSHA-512と同じMerkle–Damgård構造を通じて入力を処理します。入力は1024ビットの倍数にパディングされ、ブロックに分割され、各ブロックはCh、Maj、および2つのSigma関数を64ビットワード演算で使用した80ラウンドの混合処理を経ます。SHA-512との主な違いは初期ハッシュ値にあります:SHA-384は第9番目から第16番目の素数の平方根の小数部から導出された値を使用し、SHA-512は最初の8つの素数を使用します。すべてのブロックが処理された後、SHA-384は512ビットの内部状態をその最初の384ビットに切り詰めます。
SHA-384: fdbd8e75a67f29f701a4e040385e2e23986303ea10239211af907fcbb83578b3e417cb71ce646efd0819dd8c088de1bd
(384 bits = 48 bytes = 96 hex characters)
この切り詰めと異なる初期化により、SHA-384とSHA-512は同一の入力に対して常に異なるダイジェストを生成します。また、SHA-256やSHA-512とは異なり、SHA-384は長さ拡張攻撃に対して本質的に耐性があります。長さ拡張攻撃とは、攻撃者が元のメッセージを知らずにデータを追加して有効なハッシュを計算できる攻撃です。
SHA-384コードサンプル
SHA-384はすべての主要な言語とランタイムでネイティブにサポートされています。以下はプロジェクトに直接コピーして使用できる実例です。
// Works in all modern browsers and Node.js 18+
async function sha384(text) {
const data = new TextEncoder().encode(text)
const hashBuffer = await crypto.subtle.digest('SHA-384', data)
const hashArray = Array.from(new Uint8Array(hashBuffer))
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')
}
await sha384('hello world')
// → "fdbd8e75a67f29f701a4e040385e2e23986303ea10239211af907fcbb83578b3e417cb71ce646efd0819dd8c088de1bd"
// Node.js (built-in crypto module)
const crypto = require('crypto')
crypto.createHash('sha384').update('hello world').digest('hex')
// → "fdbd8e75a67f29f701a4e040385e2e23986303ea10239211af907fcbb83578b3e417cb71ce646efd0819dd8c088de1bd"import hashlib
# Basic SHA-384 hash
result = hashlib.sha384(b'hello world').hexdigest()
print(result)
# → "fdbd8e75a67f29f701a4e040385e2e23986303ea10239211af907fcbb83578b3e417cb71ce646efd0819dd8c088de1bd"
# Hash a string with Unicode characters
text = 'café ☕'
hashlib.sha384(text.encode('utf-8')).hexdigest()
# → 96-character hex string
# Hash a file in chunks (memory-efficient)
with open('release.tar.gz', 'rb') as f:
sha = hashlib.sha384()
for chunk in iter(lambda: f.read(8192), b''):
sha.update(chunk)
print(sha.hexdigest())package main
import (
"crypto/sha512"
"fmt"
)
func main() {
data := []byte("hello world")
// SHA-384 lives in the crypto/sha512 package
hash := sha512.Sum384(data)
fmt.Printf("%x\n", hash)
// → fdbd8e75a67f29f701a4e040385e2e23986303ea10239211af907fcbb83578b3e417cb71ce646efd0819dd8c088de1bd
}# Using sha384sum (Linux) echo -n "hello world" | sha384sum # → fdbd8e75a67f29f701a4e040385e2e23... - # macOS echo -n "hello world" | shasum -a 384 # → fdbd8e75a67f29f701a4e040385e2e23... - # Using openssl (cross-platform) echo -n "hello world" | openssl dgst -sha384 # → SHA2-384(stdin)= fdbd8e75a67f29f701a4e040385e2e23986303ea... # Verify a file checksum sha384sum myfile.bin > checksum.txt sha384sum -c checksum.txt # → myfile.bin: OK