3

cryptoサーバー側で SHA256 ハッシュにNodeJS のバンドル モジュールを使用しています。クライアント側では、 という JavaScript ライブラリを使用していますCrypto-JS

従来の nonce ベースの認証を使用するログイン システムに SHA256 ハッシュを使用しています。ただし、ハッシュメッセージが同じであっても、サーバー側とクライアント側のハッシュダイジェストが一致しません(これを確認しました)。ハッシュ ダイジェストの長さも異なります。

これは、クライアント側の実装のスニペットです。

var password_hash = CryptoJS.SHA256( token.nonce /*this is the server's nonce*/ + cnonce + password ).toString(CryptoJS.enc.Base64);

これは、サーバー側の実装のスニペットです。

var sha256 = CRYPTO.createHash("sha256");
sha256.update(snonce+cnonce+password, "utf-8");
var hash = sha256.digest("base64");

これはいくつかのサンプルデータです:

client-digest: d30ab96e65d09543d7b97d7cad6b6cf65f852f5dd62c256595a7540c3597eec4
server-digest: vZaCi0mCDufqFUwVO40CtKIW7GS4h+XUhTUWxVhu0HQ=

client-message: O1xxQAi2Y7RVHCgXoX8+AmWlftjSfsrA/yFxMaGCi38ZPWbUZBhkVDc5eadCHszzbcOdgdEZ6be+AZBsWst+Zw==b3f23812448e7e8876e35a291d633861713321fe15b18c71f0d54abb899005c9princeofnigeria
server-message: O1xxQAi2Y7RVHCgXoX8+AmWlftjSfsrA/yFxMaGCi38ZPWbUZBhkVDc5eadCHszzbcOdgdEZ6be+AZBsWst+Zw==b3f23812448e7e8876e35a291d633861713321fe15b18c71f0d54abb899005c9princeofnigeria 

ハッシュが異なる理由を知っている人はいますか? 同じプロトコル/アルゴリズムであれば、常に同じハッシュが生成されると思いました。

編集:うわー。このオンライン ハッシュ ツールにアクセスしたところ、同じメッセージに対してさらに別のダイジェストが生成されます。

4509a6d5028b217585adf41e7d49f0e7c1629c59c29ce98ef7fbb96c6f27502c

編集編集:考え直して、オンラインハッシュツールが異なる理由は、おそらくhexエンコーディングを使用しているためです。base64

4

2 に答える 2

5

問題は確かにエンコーディングにありました。

クライアント側の実装を見てください。

var password_hash = CryptoJS.SHA256(message).toString(CryptoJS.enc.Base64);

パラメータには、CryptoJS.enc.Base64実際には、CryptoJS ライブラリに含まれていない別のコンポーネントが必要です (js ファイルに格納されています: enc-base64-min.js)。そのため、有効なエンコーディング タイプがない場合は、デフォルトでhex.

エンコーディングの問題を指摘してくれた @dhj に感謝します。

于 2012-12-22T05:55:03.017 に答える
1

問題は、クライアントが 16 進数でエンコードされたダイジェストを生成するのに対し、サーバーは base64 エンコードを使用することです。

于 2012-12-22T10:02:10.790 に答える