0

我已經部署了一個webjob(.net 4.6),它加密了一些url字符串並通過電子郵件發送給客戶。我使用.NET Core的IDataProtector進行加密,因爲webjob .net 4.6不支持它的庫,所以我不得不手動引用這個DLL。System.Security.Cryptography.CryptographicException:'在密鑰環中未找到密鑰{00000000-0000-0000-0000-000000000000}'。

例如在webjob:

IDataProtector protector = provider.CreateProtector("myProtector") 
http://test.com/Email/Agreement?n=" + protector.Protect(name) + "&a=" + protector.Protect(address) 

成爲在電子郵件中的鏈接

http://test.com/Email/Agreement?n=CfDJ8AAAAAAAAAAAAAAAAAAAAAD96g09022UwEG-GyVftzkm-n2JuL1hmvL5HLyghXliIgJ_N014EBqBFfWjmdA&a=CfDJ8AAAAAAAAAAAAAAAAAAAAAALoq9IuMBZKozhzH3jRaHpyFE1wtXzQK3T_0RNuX9LsSVxPITWgU9ZR21jXLk3YGjt 

當客戶在他們的電子郵件中點擊url鏈接時,它會去我的客戶端應用程序的(.Net Core 1.1)控制器解密url字符串以彈出協議頁面。

例:

public EmailController(IDataProtectionProvider provider) 
{   
    _protector = provider.CreateProtector("myProtector"); 
} 
public IActionResult Agreement(string n, string a) 
{  
    var decryptName = _protector.Unprotect(n); 
    var decryptAddress = _protector.Unprotect(a); 
} 

但是,我得到一個以下錯誤消息,當我試圖取消保護他們:

System.Security.Cryptography.CryptographicException:「關鍵{00000000-0000 -0000-0000-000000000000}在密鑰環中找不到。'

當我搜索答案時,我意識到我可以配置Data Protection將密鑰存儲到Azure Blob存儲。這link演示瞭如何將密鑰持久存儲到azure blob存儲中。

問題:

  1. 什麼是最好的辦法不是將其存儲一鍵蔚藍Blob存儲等?
  2. 如果我在正確的軌道上,我該如何存儲它?
  3. 如何爲webjob項目配置相同的設置,如鏈接中沒有Startup.cs的配置所示?

非常感謝您的幫助。

回答

2

除了將密鑰存儲到azure blob存儲之外,最佳方法是什麼?

根據您所提供的文件中,我們可以存儲在文件系統,Azure的Redis的,Azure存儲和註冊表的關鍵。由於註冊表不支持Web作業(Azure Web App)。如果選擇文件系統,我們還需要在Web作業和Web應用程序之間傳輸密鑰。所以Azure Redis和Azure存儲將是最好的方法。

如果我在正確的軌道上,我該如何存儲它?

以下是如何在Azure存儲上存儲密鑰的詳細步驟。

第1步,如果您沒有帳戶,則需要創建一個Azure存儲帳戶。

第2步,使用NuGet安裝Microsoft.AspNetCore.DataProtection.AzureStorage軟件包。

第3步,使用以下代碼配置DataProtection。我們需要調用SetApplicationName方法並使用與Web Job相同的應用程序名稱。

var storageAccount = CloudStorageAccount.Parse("put your azure storage connection string here"); 
var client = storageAccount.CreateCloudBlobClient(); 

var container = client.GetContainerReference("key-container"); 
container.CreateIfNotExistsAsync().GetAwaiter().GetResult(); 

services.AddDataProtection().SetApplicationName("myapplication") 
    .PersistKeysToAzureBlobStorage(container, "keys.xml"); 

第4步,在您的控制器中,您可以使用IDataProtectionProvider,如下所示。

public class HomeController : Controller 
{ 
    private IDataProtector _protector; 
    public HomeController(IDataProtectionProvider provider) 
    { 
     _protector = provider.CreateProtector("test-purpose"); 
    } 

    public IActionResult Index() 
    { 
     string encryptedTExt = _protector.Protect("abcd"); 
     return Content(encryptedTExt); 
    } 
} 

如何配置爲webjob項目相同的設置,如圖中不具有Startup.cs進行配置的聯繫?

第1步,您需要添加對以下DLL的引用。

enter image description here

步驟2中,添加一個包裝類IDataProtector的如下。

public class EncryptService 
{ 
    IDataProtector _protector; 

    // the 'provider' parameter is provided by DI 
    public EncryptService(IDataProtectionProvider provider) 
    { 
     _protector = provider.CreateProtector("test-purpose"); 
    } 

    public string Protect(string text) 
    { 
     return _protector.Protect(text); 
    } 

    public string Unprotect(string encryptedText) 
    { 
     return _protector.Unprotect(encryptedText); 
    } 
} 

第3步,使用ServiceCollection配置數據保護服務。請注意,我們需要調用SetApplicationName方法,使用與您的Web應用程序相同的應用程序名稱。

static void Main() 
{ 
    var storageAccount = CloudStorageAccount.Parse("put your azure storage connection string here"); 
    var client = storageAccount.CreateCloudBlobClient(); 

    var container = client.GetContainerReference("key-container"); 
    container.CreateIfNotExistsAsync().GetAwaiter().GetResult(); 

    var serviceCollection = new ServiceCollection(); 

    serviceCollection.AddDataProtection().SetApplicationName("myapplication") 
     .PersistKeysToAzureBlobStorage(container, "keys.xml"); 

    var services = serviceCollection.BuildServiceProvider(); 
} 

第4步,之後,您可以使用以下代碼來加密或解密您的數據。

var encryptService = ActivatorUtilities.CreateInstance<EncryptService>(services); 
string text = encryptService.Protect("abcd"); 
+0

太棒了!謝謝阿莫爾,我會給它一個機會 – pavilion