- Published on
ASP.NET Core 的 資料保護功能 (Data Protection)
ASP.NET Core 內建有資料保護功能,可以方便我們加解密資料
ASP.NET Core 2.2
設定
- 在
Startup
的ConfigureServices
加入 Data Protection- 使用
PersistKeysToFileSystem
把私鑰保存起來
- 使用
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"dataProtection"));
- 程式一執行就會在根目錄下面建立私鑰的 XML 檔案
- 預設的過期時間為
90天
- 預設加密 (encryption) 的演算法為
AES_256_CBC
- 預設驗證 (validation) 的演算法為
HMACSHA256
- 預設的過期時間為
- 如果要修改預設的演算法可以使用
UseCryptographicAlgorithms
- 可以看到內建有許多的演算法可以選擇
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"dataProtection"))
.UseCryptographicAlgorithms(new AuthenticatedEncryptorConfiguration
{
EncryptionAlgorithm = EncryptionAlgorithm.AES_128_CBC,
ValidationAlgorithm = ValidationAlgorithm.HMACSHA256
});
資料保護 (加解密)
- 注入
IDataProtectionProvider
來使用- 使用
CreateProtector
來建立保護者,可以把它想像成公鑰
- 使用
private readonly IDataProtector _dataProtector;
public HomeController(IDataProtectionProvider provider)
{
_dataProtector = provider.CreateProtector("Publish Key");
}
- 加密
var protectWord = _dataProtector.Protect("Hello Cash");
- 解密
var unprotectWord = _dataProtector.Unprotect(protectWord);
- 測試
有時間限制的資料保護 (加解密)
- 修改前面的程式,多加
ToTimeLimitedDataProtector
private readonly ITimeLimitedDataProtector _timeLimitedDataProtector;
public HomeController(IDataProtectionProvider provider)
{
_timeLimitedDataProtector = provider.CreateProtector("Publish Key")
.ToTimeLimitedDataProtector();
}
- 加密
- 可以在第二個參數傳入過期的時間
var protectWord = _timeLimitedDataProtector.Protect("Hello Cash", TimeSpan.FromSeconds(3));
- 解密
- 解密沒有影響
var unprotectWord = _timeLimitedDataProtector.Unprotect(protectWord);
- 測試
- 過期時間為 2 秒,使用
Thread.Sleep
3 秒來測試 - 無法解密時會發生
Exception
- 過期時間為 2 秒,使用
使用不同的 Protector 加解密
- 加密
var protectWord = _provider.CreateProtector("Key1").Protect("Hello Cash");
- 解密
var unprotectWord = _provider.CreateProtector("key2").Unprotect(protectWord);
- 測試
- 因為
Protector
不同直接發生Exception
- 因為
多重 Protector
- 可以在同一個
Protector
之下在建立不同的Protector
,讓我們可以方便管理和使用
provider.CreateProtector("System").CreateProtector("Sub System 1");
provider.CreateProtector("System").CreateProtector("Sub System 2");
後記
這篇把大概的 Data Protection 用法講解了一次,如果有比較特殊的需求可以參考官方說明 - 設定 ASP.NET Core 資料保護
Data Protection 的功能方便了我們在資料的加解密上面的實作,只要呼叫相關的方法就可以作到以往需要實作很多程式碼的麻煩
不過這個加解密應該只適用在自己的系統上面,如果和第三方系統有加解密的需求,還是需要使用公開的加解密方式會比較方便
目前還沒有測試到的部份是私鑰過期之後會有什麼情況,用之前私鑰加密是不是可以解密之類的