Blazor是使用WebAssembly技术将C#代码运行在浏览器端的开源框架。其中SubtleCrypto是Web Cryptography API的一部分,用于加密和解密数据。但是,在.net 6中使用SubtleCrypto解密数据时,可能会遇到以下问题:
在使用RSA密钥对解密数据时,可能会出现“未捕获的JS异常: TypeError:上下文decryptData在解密数据时为空或未定义”错误。
在使用AES-GCM算法解密数据时,可能会出现解密失败的情况。
解决方法如下:
async Task DecryptWithRsa(string data, string privateKey)
{
using var rsa = RSA.Create();
rsa.ImportRSAPrivateKey(Convert.FromBase64String(privateKey), out var _);
var decrypted = await jsRuntime.InvokeAsync("blazor.subtleCrypto.decryptRsa", rsa, data);
return decrypted;
}
这里使用了jsRuntime.InvokeAsync方法实现对JavaScript的调用。同时,也要注意在JavaScript代码中传递正确的解密参数。
private static byte[] _salt = Encoding.UTF8.GetBytes("1234567812345678");
private static byte[] _nonce = Encoding.UTF8.GetBytes("123456781234");
async Task DecryptWithAesGcm(string data, string key)
{
using var aes = AesGcm.Create();
var keyDerivedBytes = new Rfc2898DeriveBytes(key, _salt, 1000).GetBytes(16);
var decrypted = await jsRuntime.InvokeAsync("blazor.subtleCrypto.decryptAesGcm", aes, keyDerivedBytes, _nonce, data);
return decrypted;
}
这里使用了Rfc2898DeriveBytes类生成AES密钥,并将其传