c# - 为什么Node.js的符号和CryptographicEngine的符号结果有区别?

我正在尝试使用UWP的CryptographicEngine验证由Node.js加密API进行的签名哈希。因为Verify方法一直返回false,所以现在比较两种签名方法。当我使用两个系统对简单字符串进行签名时,都会得到不同的结果。

这是Crypto JS代码:

//Generate signer and hasher
var signature = crypto.createSign('RSA-SHA256');

var hasher = crypto.createHash("SHA256");    
hasher.update('mydata');

//Generate hash from data
hashresult = hasher.digest('base64');

signature.update(hashresult);

//Read private key
var inputkey = fs.readFileSync('private.pem');

//Sign Data
var result = signature.sign(inputkey, 'base64');


这是CryptographicEngine代码:

IBuffer buffer = CryptographicBuffer.ConvertStringToBinary("mydata", BinaryStringEncoding.Utf8);

HashAlgorithmProvider hashAlgorithm = HashAlgorithmProvider.OpenAlgorithm(HashAlgorithmNames.Sha256);

IBuffer hashBuffer = hashAlgorithm.HashData(buffer);

var basehash = CryptographicBuffer.EncodeToBase64String(hashBuffer);

Debug.WriteLine("HASHED RESULT");
Debug.WriteLine(basehash);

//ENCRYPT SIGNATURE using GetPrivateKey to get base64 key without headers
string privatekey = await GetPrivateKey();
//Convert key to IBuffer
IBuffer privatekeybuf = CryptographicBuffer.DecodeFromBase64String(privatekey);

AsymmetricKeyAlgorithmProvider provider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaSignPkcs1Sha256);

CryptographicKey encryptKey = provider.ImportKeyPair(privatekeybuf, CryptographicPrivateKeyBlobType.Pkcs1RsaPrivateKey);

var encryptedresult = CryptographicEngine.Sign(encryptKey, hashbuffer);

string resultencrypted = CryptographicBuffer.EncodeToBase64String(encryptedresult);

Debug.WriteLine("ENCRYPTED RESULT");
Debug.WriteLine(resultencrypted);


我已经验证了在JS和UWP中创建的两个哈希是相等的。但是,两种签名方法的结果均不是。这些有什么不同?似乎编码是相等的。我在UWP中尝试了Sign和SignHashedData,还尝试了其他各种编码。

有任何想法吗?

最佳答案

Node.js的Sign classCryptographicEngine.Sign都期望未哈希的数据。您无需额外哈希数据。您应该在Node.js和C#中删除双重哈希。

RSA加密和签名生成使用填充以提供任何有意义的安全性。有几种不同的填充类型是等效的,但有些是随机的。如果Node.js或UWP使用随机填充,则您不能简单地比较签名结果。检查您的实现是否兼容的唯一方法是在一端签名一些数据,然后在另一端进行验证。然后在另一个方向重复该操作。

本文翻译自 https://stackoverflow.com/questions/34753254/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 c# node.js cryptography digital-signature uwp


相关文章:

c# - 在小数点后两位后截断Timespan

c# - 程序Log4Net Config复制条目

c# - ConfigurationManager和静态类

c# - 写入/读取int值时如何触发函数调用?

c# - ASP.NET MVC在发送状态为500的响应时显示错误页面

c# - 泛型与继承(不涉及任何收集类时)

c# - Linq-选择特定的列

c# - 是否可以为HashSet设置泛型?

c# - 3D中两个矩形之间的交点

c# - C#-与SQL Server 2005的公共全局连接