業務に出てきたので、メモ
ハッシュ関数とは
任意の入力データを固定長のハッシュ値に変換する関数
特徴は、入力の長さに関わらず常に固定長の出力を返し、同じ入力に対しては常に同じハッシュ値を返すが、異なる入力に対してはできるだけ異なるハッシュ値を返すように設計されている
ハッシュ関数と暗号化の違い
ハッシュ関数は暗号化と混同されやすいですが、ハッシュ関数は暗号化と異なり、ハッシュ値から元のデータを復元することはできない、不可逆性があります。
暗号化は、データを暗号化して保護し、鍵を使って復号することができます。
ハッシュ化は、データの秘匿性を高めるために使われることが多いです。
SHA256
「Secure Hash Algorithm 256」の略で、ハッシュ関数の一種
- 256ビット(32バイト、64文字の16進数文字列)のハッシュ値を出力する
- 入力がどんな長さでも、出力は常に256ビット固定
- 暗号学的に安全(衝突や逆算が極めて困難)
- 一方向性(ハッシュ値から元のデータを復元できない)
具体的な用途
- ファイルやデータの改ざん検知
ソフトウェア配布サイト等でダウンロードするファイルの「SHA-256ハッシュ値」が公式サイトに記載されていることがあります。
利用者はダウンロード後にファイルのSHA-256ハッシュ値を計算し、公式値と一致するか確認することで改ざんの有無をチェックできます。 - パスワードのハッシュ化・保存
Webサービスの認証システムで、ユーザーパスワードを生のまま保存せず、SHA-256でハッシュ化してからデータベースに保存します(実際はソルトやストレッチングも併用されます)。 - 電子署名や証明書
SSL/TLS証明書で、証明書の内容をSHA-256でハッシュ化し、そのハッシュ値をもとに署名します。これにより証明書の改ざん検知が可能です。 - ブロックチェーン・暗号資産
ビットコインで、ブロックのハッシュ計算やマイニング(プルーフ・オブ・ワーク)、アドレス生成などにSHA-256が使われています。 - バージョン管理システム
Gitはコミットやオブジェクトの識別子にSHA-1を使っていますが、セキュリティ強化によりSHA-256へ移行する動きもあります。 - APIのリクエスト署名
AWSやGCPなどクラウドサービスのAPI認証で、リクエスト内容をSHA-256でハッシュ化し署名することで「なりすまし」や「改ざん」を防ぐ仕組みがあります。
以下、JavaScriptでテキストをSHA256化するサンプル
const sha256 = async (userId: string) => {
// テキストをエンコード
const encoder = new TextEncoder()
const data = encoder.encode(userId)
// SHA-256でハッシュ化
const hashBuffer = await crypto.subtle.digest('SHA-256', data)
// ArrayBufferを16進数文字列に変換
const hashArray = Array.from(new Uint8Array(hashBuffer))
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')
}
crypto-jsとかライブラリを使えばもっと簡単にできます。
https://www.npmjs.com/package/crypto-js