0
私の所属: .NetクライアントアプリケーションとNodejsサーバーアプリケーション。.NETでBouncyCastleを使用して署名し、NodeJSで確認する
私が達成しようとしていること: .Netクライアントアプリケーションはクライアントの秘密鍵を使用して要求データに署名し、署名はクライアント公開鍵を使用してサーバーで検証する必要があります。
問題:検証は常に失敗します。 (はBouncyCastleを使用)
クライアントコード:( 'URSA')を使用して
var encoder = new UTF8Encoding();
var inputData = encoder.GetBytes(plainText);
var signer = SignerUtilities.GetSigner("SHA256WITHRSA");
signer.Init(true, privateKey);
signer.BlockUpdate(inputData, 0, inputData.Length);
var sign = signer.GenerateSignature();
var signmsg = Convert.ToBase64String(sign); //This signature is sent to server
Serverコード:
var isauthentic=pubkeyClient.hashAndVerify('sha256', plainText, signmsg, 'base64');
// this is always false. plainText is the same request message in the
// client and signmsg is the signature sent by the client
Serverコード( 'ノードRSA')を使用して:
var b = new Buffer(signmsg, 'base64');
var auth=pubkeyClient.verify(plainText, b); // This returns false too
EDIT:node-rsaモジュールを使用するコードを追加しました。結果はほとんど同じです。
私はここで間違っていますか?私の要件を達成する他の方法はありますか?
あなたの助けを借りて私は問題を絞り込めました。問題は、クライアントアプリケーションのplainText変数がJavaScriptSerializer()。Serialize(data);を使用して生成されたJSON文字列であることです。これにより、クライアントとサーバーの文字列が異なるため、検証が常に失敗する原因となる「/」が追加されます。これを回避する方法はありますか? – mkr231
その場合、 'data'とは何ですか? JSONシリアライザがシリアライズされた出力にランダムにスラッシュを追加するのを見たことはありません。 – mscdex
この場合、 'data'は' JavaScriptSerializer()。Serialize(data); 'を使ってJSONオブジェクトにシリアライズされるオブジェクトです。このJSON文字列は暗号化され、サーバーに送信されます。サーバーはメッセージを復号化し、視覚的に似たJSON文字列を取得します。しかし、私は理解できないいくつかの違いがあります。これが私の問題の原因です。 JSON文字列の代わりに、 "Hello World"のような単純な文字列を使用すると、これは完全にうまく動作します。なぜこれが起こっているのか分かりません。 – mkr231