为什么Node.js';sign和CryptographicEngine签名结果

本文关键字:CryptographicEngine 结果 sign Node js 为什么 | 更新日期: 2023-09-27 18:30:12

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

这是CryptoJS代码:

//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');

这是加密引擎代码:

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和CryptographicEngine签名结果

Node.js的Sign类和CryptographicEngine.Sign都需要未处理的数据。您不需要另外对数据进行散列。您应该删除Node.js和C#中的双重哈希。

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

相关文章:
  • 没有找到相关文章