在 ASP.Net Core 数据保护栈中提供了一种非常简单的办法来加密API,从而爱护数据的平安,通常落地的做法就是 数据加密
和 数据解密
,这篇文章咱们就来一起看看如何应用 数据保护API。
了解加密和哈希
在平安畛域,加密和hash是两个十分重要的概念,经常被开发者混用,其实这是不对的,加密是用一种加密算法将一种数据转换成另外一种数据,同时也要留神,这是一种双向操作,已加密的数据只能通过一个适合的密钥去解密,加过密的数据又称为密文,在现在的零碎间通信,数据加密还是非常简单高效的。
相比之下,hash 是一种将 text 转成 音讯摘要
的技术,要值得注意的是,hash值是惟一的,这就意味着不同的text文本不可能生成同一个 hash 值,而且还要留神的是,当 text 转成了 hash 值之后,你很难再将 hash 值再还原成 text 文本。
总的来说,加密是一种双向技术,能够应用同一个密钥对数据进行加密解密,hash是一种单向技术,它能够将 text 转成 音讯摘要,而这个摘要很难再还原成原始text。
装置 Microsoft.AspNetCore.DataProtection
要想应用 数据保护API
, 能够应用 Visual Studio 2019 中的 NuGet package manager
可视化界面,还能够用 NuGet package manager console
在命令行窗口中键入如下命令。
dotnet add package Microsoft.AspNetCore.DataProtection -Version 2.2.0
配置数据保护API
依照 ASP.NET Core 的默认常规,先将 DataProtection
注入到 ServiceCollection 中,如下代码所示。
public class Startup { // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddDataProtection(); } }
如果你想将加密和解密用到的 密钥
独自寄存到文件系统中的话,能够在注入时略微批改一下,如下代码所示:
public class Startup { // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddDataProtection().PersistKeysToFileSystem(new DirectoryInfo(@"D:\IDG\Temp")); } }
值得注意的是,密钥
是由 数据保护API
创立和保护,默认状况下这个 key 的有效期是 90天,如果你有非凡需要,也能够本人指定 key 的有效期,如下代码所示:
public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.ConfigureDataProtection(dp => { dp.PersistKeysToFileSystem(new DirectoryInfo(@"D:\IDG\Temp")); dp.SetDefaultKeyLifetime(TimeSpan.FromDays(7)); }); } }
你甚至能够应用一个证书来爱护密钥,也能够间接应用 Azure Key Valult
来存储密钥,如果想应用后者,能够用上面的代码来配置。
public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddDataProtection().PersistKeysToAzureBlobStorage(new Uri("Specify the Uri here")) .ProtectKeysWithAzureKeyVault("keyIdentifier", "clientId", "clientSecret"); } }
数据加密
当初 数据保护API
曾经装置并配置胜利了,接下来看看如何在 Controller 中应用数据保护API。
[ApiController] [Route("[controller]")] public class WeatherForecastController : ControllerBase { IDataProtector _protector; public WeatherForecastController(IDataProtectionProvider provider) { _protector = provider.CreateProtector(GetType().FullName); } [HttpGet] public string Get() { var protectedData = _protector.Protect("Hello World"); return protectedData; } }
从图中能够看到,HelloWorld
曾经被胜利加密返回给到前端了,对了,为了可能尽量可复用,能够独自用一个帮忙类来做 数据保护API
中的数据加密解密,如下代码所示:
public class DataProtectionHelper { private readonly IDataProtectionProvider _dataProtectionProvider; public DataProtectionHelper(IDataProtectionProvider dataProtectionProvider) { _dataProtectionProvider = dataProtectionProvider; } public string Encrypt(string textToEncrypt, string key) { return _dataProtectionProvider.CreateProtector(key).Protect(textToEncrypt); } public string Decrypt(string cipherText, string key) { return _dataProtectionProvider.CreateProtector(key).Unprotect(cipherText); } }
值得注意的是,下面的 Encrypt 和 Decrypt 办法的第二个参数是密钥key,这样的话 密钥
的掌控权就在你的手上了。
数据保护API
应用起来还是非常简单灵便的,应用这种办法来生成密文数据是一种十分好的办法,常见的场景太多了,比方:cookie,querystring 中的数据,而且在过期工夫之内加密解密操作都是平安的,如果你的密文要维持很长的工夫,这种场景下倡议本人实现 加密解密
逻辑。
译文链接:https://www.infoworld.com/art...
更多高质量干货:参见我的 GitHub: csharptranslate