5

Node.js 暗号モジュールを使用して、一部のデータの署名を検証しようとしています。Node.js 0.8.0 を使用しています。

ファイル内のデータは MD5 アルゴリズムを使用してハッシュされ、RSA 秘密鍵を使用して署名され、署名は別のファイルに保存されます。これはすべて Java ライブラリを使用して行われています。

openssl を使用して署名を検証する場合、これは成功です。次を使用します。

openssl dgst -verify mykey.pem -signature example.sig hello.txt

で応答しVerified OKます。hello.txt の 1 文字を変更すると、検証されません。上記のコマンドに -MD5 パラメーターを追加しても機能しますが、これがデフォルトだと思いますが、-MD4 または -SHA と言った場合、検証されません。これはすべて良いです。

次に、openssl をラップする Node 暗号化モジュールを使用しようとすると、この検証が機能しません。

私のコード例は次のとおりです。

var crypto = require("crypto");
var fs = require("fs");

var data = fs.readFileSync("./hello.txt");
var pubkey = fs.readFileSync("./mykey.pem", "utf8");
var signature = fs.readFileSync("./example.sig");

var verifier = crypto.createVerify ('RSA-MD5');
verifier.update (data);
var success = verifier.verify (pubkey, signature);
console.log(success);

これは常に を出力しますfalse。私が試してみました:

  • テキストファイルであるため、データを「utf8」および「ascii」でエンコードして読み取ります。
  • 「ascii」でエンコードされたキーを読み取る (ある時点で誤ってエンコードされたキーを読み込んでいたときにいくつかの例外が発生したため、キーは問題ないと考える理由があります)
  • ダイジェスト アルゴリズムとして RSA-MD5 の代わりに MD5 を使用する
  • バイナリではなくbase64でエンコードされた署名をロードし、検証関数に「base64」パラメーターを配置します。

私のコードがここに示す openssl コマンド ラインと同じ操作を実行していると誤解していますか? これを解決する方法について何か提案はありますか?

更新: キーだけでなく、自己署名の信頼できる証明書を使用してみました。openssl が証明書を検証することを確認しましたが、ノードの暗号化ライブラリはファイルを検証しません。

4

1 に答える 1

7

最終的に、それが署名形式の問題であることがわかりました.verifyには3番目のパラメーターがあり、「hex」形式の場合、デフォルトで「binary」になります。

最終的な解決策は SHA1 ハッシュの使用に移行し、わずかに異なるストリーム API を持つノード 0.10 で実行されるようになりましたが、変更された関連行は次のとおりです。

result = verifier.verify(publicKey, signature, 'hex');
于 2013-11-07T23:04:55.807 に答える