首先你需要知道的是blazor wasm 模型直到 .net 5 不支持加密库。 (据我所知)
在.net 6中你可以使用Blazor.SubtleCrypto https://www.nuget.org/packages/Blazor.SubtleCrypto/#readme-body-tab
但您可以使用 javascript 互操作将 AES 方法注入其中,请按照以下步骤操作:
- 下载AES.js https://github.com/ricmoo/aes-js
- 将 aes.js 添加到 wwwroot 文件夹
- 在index.html根目录的脚本标记中添加以下两个方法来加密/解密字符串
function encryptedText(inputSrt, keyArray) {
var textBytes = aesjs.utils.utf8.toBytes(inputSrt);
var aesCtr = new aesjs.ModeOfOperation.ctr(keyArray, new aesjs.Counter(5));
var encryptedBytes = aesCtr.encrypt(textBytes);
return aesjs.utils.hex.fromBytes(encryptedBytes);
}
function decryptText(inputStr, keyArray) {
var encryptedBytes = aesjs.utils.hex.toBytes(inputStr);
var aesCtr = new aesjs.ModeOfOperation.ctr(keyArray, new aesjs.Counter(5));
var decryptedBytes = aesCtr.decrypt(encryptedBytes);
return aesjs.utils.utf8.fromBytes(decryptedBytes);
}
现在你准备好了。将 DI 接口添加到 .NetCore 请按照以下步骤操作:
- 创建类和接口
public interface IEncryptProvider
{
string TextEncrypt(string input);
string TextDecrypt(string input);
string Encrypt<T>(T input);
T Decrypt<T>(string input);
}
public class AesJsProvider : IEncryptProvider
{
IJSRuntime GetJSRuntime;
public static int[] HiddenKey = new int[] { 0, 45, 6, 3, 8, 5, 8, 7, 89, 7, 10, 21, 12, 34, 12, 1 };
public static string JsEncryptMethod { get; set; } = "encryptText";
public static string JsDecryptMethod { get; set; } = "decryptText";
public AesJsProvider(IJSRuntime jSRuntime)
{
GetJSRuntime = jSRuntime;
}
public async Task<string> TextDecrypt(string input)
{
if (string.IsNullOrEmpty(input))
return string.Empty;
try
{
return await GetJSRuntime.InvokeAsync<string>(JsEncryptMethod, input, HiddenKey);
}
catch (Exception)
{
return string.Empty;
}
}
public async Task<string> TextEncrypt(string input)
{
if (string.IsNullOrEmpty(input))
return string.Empty;
try
{
return await GetJSRuntime.InvokeAsync<string>(JsDecryptMethod, input, HiddenKey);
}
catch (Exception)
{
return string.Empty;
}
}
public async Task<string> Encrypt<T>(T input)
{
var str = JsonSerializer.Serialize(input);
if (input == null)
return string.Empty;
try
{
return await GetJSRuntime.InvokeAsync<string>(JsEncryptMethod, input, HiddenKey);
}
catch (Exception)
{
return string.Empty;
}
}
public async Task<T> Decrypt<T>(string input)
{
var str = await TextDecrypt(input);
if (string.IsNullOrEmpty(input))
return default(T);
try
{
return await GetJSRuntime.InvokeAsync<T>(JsDecryptMethod, input, HiddenKey);
}
catch (Exception)
{
return default;
}
}
}
所有代码都已完成,让我们配置启动选项
services.AddSingleton<IEncryptProvider, JSRuntimeProvider>();
你可以改变改变隐藏钥匙因为您需要提供程序中的密钥,然后注入加密提供者在任何页面上加密/解密字符串或对象
源码可以在github上找到:https://github.com/mahdiit/blazor-wasm-encryptstorage https://github.com/mahdiit/blazor-wasm-encryptstorage