Skip to content

NOTE

Bun は以下で文書化されている Bun 固有の API に加えて、[`node:crypto`](https://nodejs.org/api/crypto.html) の `createHash` および `createHmac` 関数を実装しています。

Bun.password

Bun.password は、さまざまな暗号化セキュアなアルゴリズムを使用したパスワードのハッシュ化と検証のためのユーティリティ関数のコレクションです。

ts
const password = "super-secure-pa$$word";

const hash = await Bun.password.hash(password);
// => $argon2id$v=19$m=65536,t=2,p=1$tFq+9AVr1bfPxQdh6E8DQRhEXg/M/SqYCNu6gVdRRNs$GzJ8PuBi+K+BVojzPfS5mjnC8OpLGtv8KJqF99eP6a4

const isMatch = await Bun.password.verify(password, hash);
// => true

Bun.password.hash の第 2 引数は、ハッシュアルゴリズムを選択して設定できるパラメーターオブジェクトを受け付けます。

ts
const password = "super-secure-pa$$word";

// argon2 を使用(デフォルト)
const argonHash = await Bun.password.hash(password, {
  algorithm: "argon2id", // "argon2id" | "argon2i" | "argon2d"
  memoryCost: 4, // メモリ使用量(キビバイト)
  timeCost: 3, // 反復回数
});

// bcrypt を使用
const bcryptHash = await Bun.password.hash(password, {
  algorithm: "bcrypt",
  cost: 4, // 4-31 の間の数値
});

作成に使用されたアルゴリズムはハッシュ自体に保存されます。bcrypt を使用する場合、返されるハッシュはほとんどの既存の bcrypt 実装との互換性のために Modular Crypt Format でエンコードされます。argon2 を使用する場合、結果は新しい PHC format でエンコードされます。

verify 関数は入力ハッシュに基づいてアルゴリズムを自動的に検出し、正しい検証方法を使用します。PHC または MCF エンコードされたハッシュの両方からアルゴリズムを正しく推測できます。

ts
const password = "super-secure-pa$$word";

const hash = await Bun.password.hash(password, {
  /* 設定 */
});

const isMatch = await Bun.password.verify(password, hash);
// => true

すべての関数の同期バージョンも利用可能です。これらの関数は計算コストが高いため、ブロッキング API を使用するとアプリケーションのパフォーマンスが低下する可能性があることに注意してください。

ts
const password = "super-secure-pa$$word";

const hash = Bun.password.hashSync(password, {
  /* 設定 */
});

const isMatch = Bun.password.verifySync(password, hash);
// => true

ソルト

Bun.password.hash を使用すると、ソルトが自動的に生成され、ハッシュに含まれます。

bcrypt - Modular Crypt Format

以下の Modular Crypt Format ハッシュ(bcrypt で使用):

入力:

ts
await Bun.password.hash("hello", {
  algorithm: "bcrypt",
});

出力:

sh
$2b$10$Lyj9kHYZtiyfxh2G60TEfeqs7xkkGiEFFDi3iJGc50ZG/XJ1sxIFi;

フォーマットは以下で構成されています。

  • bcrypt: $2b
  • rounds: $10 - ラウンド(実際のラウンド数の log10)
  • salt: $Lyj9kHYZtiyfxh2G60TEfeqs7xkkGiEFFDi3iJGc50ZG/XJ1sxIFi
  • hash: $GzJ8PuBi+K+BVojzPfS5mjnC8OpLGtv8KJqF99eP6a4

デフォルトでは、bcrypt ライブラリは 72 バイトを超えるパスワードを切り捨てます。Bun では、Bun.password.hash に 72 バイトを超えるパスワードを渡し、bcrypt アルゴリズムを使用する場合、パスワードは bcrypt に渡される前に SHA-512 でハッシュされます。

ts
await Bun.password.hash("hello".repeat(100), {
  algorithm: "bcrypt",
});

したがって、500 バイトのパスワードを黙って 72 バイトに切り捨てる代わりに、Bun はパスワードを SHA-512 でハッシュし、ハッシュされたパスワードを bcrypt に送信します(72 バイトを超える場合のみ)。これはより安全なデフォルトの動作です。

argon2 - PHC フォーマット

以下の PHC フォーマット ハッシュ(argon2 で使用):

入力:

ts
await Bun.password.hash("hello", {
  algorithm: "argon2id",
});

出力:

sh
$argon2id$v=19$m=65536,t=2,p=1$xXnlSvPh4ym5KYmxKAuuHVlDvy2QGHBNuI6bJJrRDOs$2YY6M48XmHn+s5NoBaL+ficzXajq2Yj8wut3r0vnrwI

フォーマットは以下で構成されています。

  • algorithm: $argon2id
  • version: $v=19
  • memory cost: 65536
  • iterations: t=2
  • parallelism: p=1
  • salt: $xXnlSvPh4ym5KYmxKAuuHVlDvy2QGHBNuI6bJJrRDOs
  • hash: $2YY6M48XmHn+s5NoBaL+ficzXajq2Yj8wut3r0vnrwI

Bun.hash

Bun.hash非暗号化 ハッシングのためのユーティリティのコレクションです。非暗号化ハッシングアルゴリズムは、衝突耐性やセキュリティよりも計算速度を最適化しています。

標準の Bun.hash 関数は Wyhash を使用して、任意のサイズの 입력から 64 ビットハッシュを生成します。

ts
Bun.hash("some data here");
// 11562320457524636935n

入力には、文字列、TypedArrayDataViewArrayBuffer、または SharedArrayBuffer を使用できます。

ts
const arr = new Uint8Array([1, 2, 3, 4]);

Bun.hash("some data here");
Bun.hash(arr);
Bun.hash(arr.buffer);
Bun.hash(new DataView(arr.buffer));

オプションで、整数シードを第 2 パラメーターとして指定できます。64 ビットハッシュの場合、精度の低下を避けるために Number.MAX_SAFE_INTEGER を超えるシードは BigInt として指定する必要があります。

ts
Bun.hash("some data here", 1234);
// 15724820720172937558n

追加のハッシングアルゴリズムは Bun.hash のプロパティとして利用可能です。API はすべて同じで、32 ビットハッシュの場合は number を返し、64 ビットハッシュの場合は bigint を返すことのみが異なります。

ts
Bun.hash.wyhash("data", 1234); // Bun.hash() と同等
Bun.hash.crc32("data", 1234);
Bun.hash.adler32("data", 1234);
Bun.hash.cityHash32("data", 1234);
Bun.hash.cityHash64("data", 1234);
Bun.hash.xxHash32("data", 1234);
Bun.hash.xxHash64("data", 1234);
Bun.hash.xxHash3("data", 1234);
Bun.hash.murmur32v3("data", 1234);
Bun.hash.murmur32v2("data", 1234);
Bun.hash.murmur64v2("data", 1234);
Bun.hash.rapidhash("data", 1234);

Bun.CryptoHasher

Bun.CryptoHasher は、さまざまな暗号化ハッシュアルゴリズムを使用して文字列またはバイナリデータのハッシュを段階的に計算できる汎用ユーティリティクラスです。以下のアルゴリズムがサポートされています。

  • "blake2b256"
  • "blake2b512"
  • "md4"
  • "md5"
  • "ripemd160"
  • "sha1"
  • "sha224"
  • "sha256"
  • "sha384"
  • "sha512"
  • "sha512-224"
  • "sha512-256"
  • "sha3-224"
  • "sha3-256"
  • "sha3-384"
  • "sha3-512"
  • "shake128"
  • "shake256"
ts
const hasher = new Bun.CryptoHasher("sha256");
hasher.update("hello world");
hasher.digest();
// Uint8Array(32) [ <byte>, <byte>, ... ]

初期化後、.update() を使用してデータを段階的にハッシャーに供給できます。このメソッドは stringTypedArray、および ArrayBuffer を受け付けます。

ts
const hasher = new Bun.CryptoHasher("sha256");

hasher.update("hello world");
hasher.update(new Uint8Array([1, 2, 3]));
hasher.update(new ArrayBuffer(10));

string が渡された場合、オプションの第 2 パラメーターを使用してエンコーディングを指定できます(デフォルトは 'utf-8')。以下のエンコーディングがサポートされています。

カテゴリエンコーディング
バイナリエンコーディング"base64" "base64url" "hex" "binary"
文字エンコーディング"utf8" "utf-8" "utf16le" "latin1"
レガシー文字エンコーディング"ascii" "binary" "ucs2" "ucs-2"
ts
hasher.update("hello world"); // デフォルトは utf8
hasher.update("hello world", "hex");
hasher.update("hello world", "base64");
hasher.update("hello world", "latin1");

データがハッシャーに供給された後、.digest() を使用して最終ハッシュを計算できます。デフォルトでは、このメソッドはハッシュを含む Uint8Array を返します。

ts
const hasher = new Bun.CryptoHasher("sha256");
hasher.update("hello world");

hasher.digest();
// => Uint8Array(32) [ 185, 77, 39, 185, 147, ... ]

.digest() メソッドはオプションでハッシュを文字列として返すことができます。そのためには、エンコーディングを指定します。

ts
hasher.digest("base64");
// => "uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek="

hasher.digest("hex");
// => "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"

または、メソッドはハッシュを既存の TypedArray インスタンスに書き込むことができます。これは一部のパフォーマンス重視のアプリケーションで望ましい場合があります。

ts
const arr = new Uint8Array(32);

hasher.digest(arr);

console.log(arr);
// => Uint8Array(32) [ 185, 77, 39, 185, 147, ... ]

Bun.CryptoHasher での HMAC

Bun.CryptoHasher は HMAC ダイジェストを計算するために使用できます。そのためには、キーをコンストラクターに渡します。

ts
const hasher = new Bun.CryptoHasher("sha256", "secret-key");
hasher.update("hello world");
console.log(hasher.digest("hex"));
// => "095d5a21fe6d0646db223fdf3de6436bb8dfb2fab0b51677ecf6441fcf5f2a67"

HMAC を使用する場合、より限定されたアルゴリズムセットがサポートされています。

  • "blake2b512"
  • "md5"
  • "sha1"
  • "sha224"
  • "sha256"
  • "sha384"
  • "sha512-224"
  • "sha512-256"
  • "sha512"

非 HMAC Bun.CryptoHasher とは異なり、HMAC Bun.CryptoHasher インスタンスは .digest() が呼び出された後にリセットされず、同じインスタンスを再度使用しようとするとエラーがスローされます。

.copy().update() などの他のメソッドはサポートされています(.digest() の前であれば)、しかし .digest() のようなハッシャーを確定するメソッドはサポートされていません。

ts
const hasher = new Bun.CryptoHasher("sha256", "secret-key");
hasher.update("hello world");

const copy = hasher.copy();
copy.update("!");
console.log(copy.digest("hex"));
// => "3840176c3d8923f59ac402b7550404b28ab11cb0ef1fa199130a5c37864b5497"

console.log(hasher.digest("hex"));
// => "095d5a21fe6d0646db223fdf3de6436bb8dfb2fab0b51677ecf6441fcf5f2a67"

Bun by www.bunjs.com.cn 編集