2016-04-04 6 views
0

Was ich habe: Eine .Net Client-Anwendung und eine Nodejs Server-Anwendung.Anmeldung mit BouncyCastle in .NET und Überprüfung in NodeJS

Was ich versuche zu erreichen: .Net Client-Anwendung signiert die Anfrage Daten mit einem Client privaten Schlüssel und die Signatur sollte auf dem Server mit öffentlichen Client-Schlüssel verifiziert werden.

Das Problem: Überprüfung schlägt immer fehl.

-Client-Code (mit BouncyCastle):

 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-Code verwendet ('Ursa'):

 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-Code verwenden ('node-rsa'):

 var b = new Buffer(signmsg, 'base64'); 
     var auth=pubkeyClient.verify(plainText, b); // This returns false too 

EDIT: Code hinzugefügt, der das Node-RSA-Modul verwendet. Das Ergebnis ist ziemlich gleich.

Was mache ich hier falsch? Gibt es einen anderen Weg, um meine Anforderung zu erfüllen?

Antwort

1

Es funktioniert für mich. I getestet, mit dem folgenden C# Code und Knotens (Knoten mit v5.10.0 geprüft) in integrierten crypto Modul:

C#:

using System; 
using System.Text; 
using System.IO; 
using Org.BouncyCastle.Security; 
using Org.BouncyCastle.Crypto; 
using Org.BouncyCastle.OpenSsl; 

public class Program 
{ 
    public static void Main() 
    { 
     var plainText = "Hello world"; 
     var privatePEM = @"-----BEGIN RSA PRIVATE KEY----- 
MIIEpQIBAAKCAQEAwTOUkBeDyeEiacGyW5UwNCg73GuIMaUNMXZwnCSjQYpMqxzr 
q3UdwFxM9Ln6rXCDJgUALvrbI6TK6HwKG/EPbC277IWvJ0WbqGpn47th70JMFyss 
LqNEREot3H9CFCmn7SM8jjQOYAQ+4M5BqPEd6gwprtP+/GxZ0nP46vSrA7qlyyp2 
MO2yTovWH5QfYB1bQvjAChEydqAP1Alqo5i2QnZ50FD6QFr2KG3+f7xmvL3K/gSs 
+ayjDNYjrKoJwY6xJ/U4103Xddr5zP0g6WL+zyjTW9M0CCXsQ7wCrPWxEXmVQeg7 
BbSwx6ATbP2pbuWHfp2GrO6PIw2wMzOwNa/O0QIDAQABAoIBAQCMxA4sZlWpU5WF 
RJG1VJ/IgMAMu3SB52YTcd5ehftFF4UA75NuW2iP7TBM5uyUTfPgUahukmv0Lm+A 
sE+VSDAae7/+dvDFRlxBezWyoaabcsyJ3PTWDjMBJqL/kuEMW8V0bEYEvjzzDGTb 
2qvQcc1/59i+/ss8E53mToVAe3/WuHVAkHU2No6jF5X9oo2O1vpTlsdYNGgl/XOa 
v1w4hL8albgQ9dvg9eZc4F1Cf8ljVejwbrllhcp+dUNAXgn3ZvOFJjGZaAgw/TuP 
L35b9cFb9c/8XyS1vVonxnosTbY8rChcjTm/TxtYNgMn4HCQCXgjDuWvjY2/Gnny 
Jk1xUOGBAoGBAOQ0HDbYur/RG36SvyDuhV92K7Zid67sFQJSjaC74SGf9QI1gEie 
9bzftIgVyGt9QVtyu4uDGegV0bh2BpdniE2MS8GpLlCj8phZmCPG255n5paaEJoj 
fUI7NGaWfojOhTPs5tZJmsQfGcsMKDnqde1yBydgelbFd/nekbxKvs7pAoGBANi8 
B0ds+wDZbROYUtkvrfVfyjkxat53SaXJLgjY0X+6vrMyY5k4u/C7PKxX7wG9ZMJJ 
sqbh0DlOlB+caN4op1F/R/C2FisE3/tkQmaCCJui06VHaQT8JAx4faYWcdNF2PqI 
EXnE/FOplCv5k/5nKc7YEB9WITiQ1lTI14ZQcx+pAoGBAK8VtBf4jL+ixf+Ew5OW 
rUmitsMGJWFVzICtqfAKdh6ARVDej4AoRc4VrMNEQzMFNOHe0zmk6nmAVBm8pC4B 
xzgITg9VqC1CvFxbUTkR12pfuTEPH3HDjNUF65xSFt8L5HMEbc83RcD3Q6jfuPVG 
iBgXhpmVkgeFFhnlw9a9WkwRAoGALDILefErLf0oVPqWylsCqiqiXg9Jr5u7lOb1 
UDCGZ/l4sanwzWnYSTqlIK+9uSkZxtSobYdWopj3c4q9h6/ajq/Zx6gZ1SPlWKoV 
MDoL71DAv89UBwQzhad8V8Xz6BUyLcRZa+9TVOwbnuwB1brLt7Yvc3RoydQfIKLj 
8CuvjiECgYEAih5s8esQa1EFbKBYbgsEHDDpmnO5izAPx5XwN9KQG1XtYwrWCthQ 
WO2MV6esw+M1AYlGkHltQQzpC8m3Uwkw/nhPvAkrnnrn/xRemMC7IHMHTVRv6MC8 
r/dHqv+4wm3v5IojDotDYlprlXU0iIkYuNxfs14GygU3LedQFzjakaw= 
-----END RSA PRIVATE KEY-----"; 

     PemReader pr = new PemReader(new StringReader(privatePEM)); 
     AsymmetricCipherKeyPair keys = (AsymmetricCipherKeyPair)pr.ReadObject(); 

     var encoder = new UTF8Encoding(); 
     var inputData = encoder.GetBytes(plainText); 

     var signer = SignerUtilities.GetSigner("SHA256WITHRSA"); 
     signer.Init(true, keys.Private); 
     signer.BlockUpdate(inputData, 0, inputData.Length); 

     var sign = signer.GenerateSignature(); 
     var signmsg = Convert.ToBase64String(sign); 
     Console.WriteLine(signmsg); 
    } 
} 

node.js:

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

// `signmsg` displayed by the above C# program 
var sig = 'ivMHsoMoXc61wcJpvelTonBkd5fqDD+aNJpo0DiamisAT5uXiTcGm56C+MIc5dd+ELTG54YRb2MzETRnBlsh6Tm9fHbCwSdZJ0GxqnKb56VKZvccQ+740Q3vw7GYfspidyUuonOA+tDLc73fhSRfTlG7c4EuzZzUvMy+2epMA7HC2drWmMXARhY1jeAPz3ofUX7$ 

// Public key derived from `privatePEM` in the above C# program 
var pubKey = `-----BEGIN PUBLIC KEY----- 
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwTOUkBeDyeEiacGyW5Uw 
NCg73GuIMaUNMXZwnCSjQYpMqxzrq3UdwFxM9Ln6rXCDJgUALvrbI6TK6HwKG/EP 
bC277IWvJ0WbqGpn47th70JMFyssLqNEREot3H9CFCmn7SM8jjQOYAQ+4M5BqPEd 
6gwprtP+/GxZ0nP46vSrA7qlyyp2MO2yTovWH5QfYB1bQvjAChEydqAP1Alqo5i2 
QnZ50FD6QFr2KG3+f7xmvL3K/gSs+ayjDNYjrKoJwY6xJ/U4103Xddr5zP0g6WL+ 
zyjTW9M0CCXsQ7wCrPWxEXmVQeg7BbSwx6ATbP2pbuWHfp2GrO6PIw2wMzOwNa/O 
0QIDAQAB 
-----END PUBLIC KEY-----`; 

var verify = crypto.createVerify('RSA-SHA256'); 
verify.update('Hello world'); 
console.log(verify.verify(pubKey, new Buffer(sig, 'base64'))); 
// Outputs: 
// true 
+0

Dank Ihrer Hilfe konnte ich das Problem eingrenzen. Das Problem besteht darin, dass die plainText-Variable in der Clientanwendung eine JSON-Zeichenfolge ist, die mit JavaScriptSerializer() generiert wurde. Serialize (Daten) ;. Dies fügt '/' dazwischen hinzu, was dazu führt, dass sich die Zeichenfolge auf dem Client und auf dem Server unterscheidet, was dazu führt, dass die Verifizierung die ganze Zeit fehlschlägt. Gibt es eine Möglichkeit, dies zu umgehen? – mkr231

+0

Was sind 'Daten' in diesem Fall? Ich habe noch nie gesehen, dass ein JSON-Serializer zufällig einen Schrägstrich in die serialisierte Ausgabe eingefügt hat. – mscdex

+0

'Daten' in diesem Fall ist ein Objekt, das in ein JSON-Objekt unter Verwendung von' JavaScriptSerializer() serialisiert wird (Daten); '. Diese JSON-Zeichenfolge wird verschlüsselt und an den Server gesendet. Der Server entschlüsselt die Nachricht und erhält eine visuell ähnliche JSON-Zeichenfolge. Aber es gibt einen Unterschied, den ich nicht herausfinden kann. Das verursacht das Problem für mich. Anstatt der JSON-Zeichenfolge, wenn ich eine einfache Zeichenfolge wie "Hello World" verwende, wie Sie es getan haben, funktioniert das ganz gut. Ich bin mir nicht sicher, warum das passiert. – mkr231

Verwandte Themen