在 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