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

我正在尝试使用UWP的CryptographicEngine来validationNode.js Crypto API所做的签名哈希。 由于validation方法保持返回false,我现在正在比较两个签名方法。 当我使用这两个系统签署简单的string时,我得到不同的结果。

这是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中创build的两个哈希是平等的。 但是两种签名方法的结果都不是。 这些有什么不同? 看来编码是平等的。 我已经尝试了UWP中的Sign和SignHashedData,并尝试了各种其他编码。

有任何想法吗?

Node.js的Sign类和CryptographicEngine.Sign期望未经CryptographicEngine.Sign的数据。 你不需要额外的散列你的数据。 你应该删除Node.js和C#中的双重散列。

RSAencryption和签名生成使用填充以提供任何有意义的安全性。 有不同types的填充是相同的,但有些是随机的。 如果Node.js或UWP使用随机填充,则不能简单地比较签名结果。 检查你的实现是否兼容的唯一方法是在一端签名一些数据,然后在另一端进行validation。 然后在另一个方向重复。