SubtleCrypto.digest()

安全なコンテキスト用: この機能は一部またはすべての対応しているブラウザーにおいて、安全なコンテキスト (HTTPS) でのみ利用できます。

SubtleCrypto インターフェースの digest() メソッドは、指定されたデータの ダイジェスト を返します。ダイジェストとは、可変長の入力に由来する固定長の短い値です。暗号的ダイジェスト値は耐衝突性を示すため、同じダイジェスト値を持つ 2 つの異なる入力を見つけるのは非常に困難です。

引数として、使用するダイジェストアルゴリズムの識別子とダイジェスト値の元となるデータを受け取ります。ダイジェスト値で解決される Promise を返します。

構文

const digest = crypto.subtle.digest(algorithm, data);

引数

  • algorithm は、使用するダイジェストアルゴリズムを定義する DOMString です。サポートされる値は次のとおりです:
    • SHA-1 (暗号化アプリケーションではこれを使用しないでください)
    • SHA-256
    • SHA-384
    • SHA-512
  • data は、ダイジェスト値の元となるデータを含む ArrayBuffer もしくは ArrayBufferView (en-US) です。

返値

  • digestPromise であり、ダイジェスト値を含む ArrayBuffer で解決されます。

対応しているアルゴリズム

ダイジェストアルゴリズムは 暗号ハッシュ関数 とも呼ばれ、任意の大きなデータブロックを固定サイズの出力 (通常は入力よりもはるかに短い出力) に変換します。暗号化にはさまざまな用途があります。

SHA-1

このアルゴリズムは FIPS 180-4, section 6.1 で定義されており、160 bit 長の出力を生成します。

警告: このアルゴリズムは現在脆弱であると見なされているため、暗号化アプリケーションには使用しないでください。

SHA-256

このアルゴリズムは FIPS 180-4, section 6.2 で定義されており、256 bit 長の出力を生成します。

SHA-384

このアルゴリズムは FIPS 180-4, section 6.5 で定義されており、384 bit 長の出力を生成します。

SHA-512

このアルゴリズムは FIPS 180-4, section 6.4 で定義されており、512 bit 長の出力を生成します。

メモ: キー付きハッシュメッセージ認証コード (HMAC) の作成方法をここで探している場合は、代わりに SubtleCrypto.sign() (en-US) を使用する必要があります。

基本的な例

この例では、メッセージをエンコードし、 SHA-256 ダイジェスト値を計算して、ダイジェスト長を記録します。

const text = 'An obscure body in the S-K System, your majesty. The inhabitants refer to it as the planet Earth.';

async function digestMessage(message) {
  const encoder = new TextEncoder();
  const data = encoder.encode(message);
  const hash = await crypto.subtle.digest('SHA-256', data);
  return hash;
}

const digestBuffer = await digestMessage(text);
console.log(digestBuffer.byteLength);

ダイジェスト値を 16 進文字列に変換する

ダイジェストはArrayBufferとして返されますが、比較および表示のために、ダイジェスト値は多くの場合 16 進文字列として表されます。 この例では、ダイジェストを計算し、ArrayBufferを 16 進文字列に変換します。

const text = 'An obscure body in the S-K System, your majesty. The inhabitants refer to it as the planet Earth.';

async function digestMessage(message) {
  const msgUint8 = new TextEncoder().encode(message);                           // (utf-8 の) Uint8Array にエンコードする
  const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8);           // メッセージをハッシュする
  const hashArray = Array.from(new Uint8Array(hashBuffer));                     // バッファーをバイト列に変換する
  const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); // バイト列を16進文字列に変換する
  return hashHex;
}

const digestHex = await digestMessage(text);
console.log(digestHex);

仕様書

Specification
Web Cryptography API
# SubtleCrypto-method-digest

ブラウザーの互換性

BCD tables only load in the browser

メモ: Chrome 60 では、 TLS 接続でない場合に crypto.subtle を無効化する機能が追加されました。

関連情報