私が使用したほとんどのパスワードハッシュモジュールにはそのような機能があるため、ノードの組み込み暗号モジュール、特にscryptの比較または検証機能を見つけようとしていました。次に、これが不可能なタスクである理由を発見しました。同じパラメーターを使用してこれらのアルゴリズムで生成されたすべてのハッシュは、同じ文字列を生成します (技術的にはバッファー)。これは、実装crypto
を含む のハッシュ関数の多くに当てはまりますpbkdf2
。
なぜこれが安全なのですか?同じ入力を使用して同じパスワード/メッセージを再度生成できないというのは、パスワード/メッセージ ハッシュ関数の (最新の) ポイントではありませんか? これは、さまざまな bcrypt モジュールがどのように機能するか、および scrypt の元のバージョンであり、そこから、私が求めている組み込みバージョンが派生しました。
例えば:
let scryptHash1;
let scryptHash2;
let scryptHash3;
let pbkdfHash1;
let pbkdfHash2;
let pbkdfHash3;
const key1 = 'my secret key';
const key2 = 'my other secret key';
const salt = 'my salt';
crypto.scrypt(key1, salt, 16, hash => scryptHash1 = hash);
crypto.scrypt(key1, salt, 16, hash => scryptHash2 = hash);
crypto.scrypt(key2, salt, 16, hash => scryptHash3 = hash);
scryptHash1.toString() === scryptHash2.toString(); // true
scryptHash1.toString() === scryptHash3.toString(); // false
crypto.pbkdf2(key1, salt, 16, 16, 'sha256', hash => pbkdfHash1 = hash);
crypto.pbkdf2(key1, salt, 16, 16, 'sha256', hash => pbkdfHash2 = hash);
crypto.pbkdf2(key2, salt, 16, 16, 'sha256', hash => pbkdfHash3 = hash);
pbkdfHash1.toString() === pbkdfHash2.toString(); // true
pbkdfHash1.toString() === pbkdfHash3.toString(); // false
Cryptography
から に引っ越したいので、何よりも安全性が心配なので、最初にこの質問を にしbcrypt
ましたscrypt
。しかし、複数の人が指摘しているように、そして私が恐れていたように、問題は API の設計に関するものです。そうは言っても、受け入れられた回答には、この方法が安全である理由、または切り替えるのに十分安全である理由を含める必要があります(「十分に安全」が十分に安全ではないことを認めます)。私はセキュリティを専攻していましたが、現在は Web 開発者であり、コアの概念はほとんど同じままですが、セキュリティは常に変化しています。