2012-09-25 51 views
6

您會建議在MVCC#之間創建安全密碼重置鏈接的方式?我的意思是,我將創建一個隨機令牌,對不對?如何在發送給用戶之前對其進行編碼?是MD5夠好嗎?你知道任何其他安全的方式嗎?如何創建密碼重置鏈接?

+0

大多數加密庫有生成加密隨機數的工具JWT。你不需要散列,編碼或加密任何東西。你只需要一個隨機數,而不是Random類可以提供的隨機數。 – Servy

回答

2

我不認爲你需要一個加密的字符串用於此目的。我認爲創建一個字符串Guid就足夠了。

string thatString=Guid.NewGuid("n").ToString(); 

將它保存在您的數據庫表中針對該特定用戶帳戶。爲具有此字符串的用戶創建一個鏈接並將其發送給他們。當他們點擊它時,它會將它們帶到一個操作方法中,並且它們會得到與我們存儲的此臨時字符串相關聯的相應用戶記錄,並顯示用於更新密碼的表單。

如果你有疑問Guid是否是唯一的,結賬this

+10

獨特!=隨機。 [GUID不是隨機的。](http://blogs.msdn.com/b/ericlippert/archive/2012/05/07/guid-guide-part-three.aspx)它們的設計不是不可預測的。它們只是設計爲不重複。 – Servy

+0

我也使用這種方法,Guid。如果您對唯一性感到困擾,則可以檢查它是否已存在於數據庫中。我還設置了一個時間限制(所以鏈接只能點擊兩個小時),這樣可以進一步限制碰撞的機會。 – Michel

15

使用System.Security.Cryptography.RandomNumberGenerator這是一個密碼安全的RNG。只需將其包含在電子郵件中,並將其存儲在數據庫中供稍後檢索。我沒有看到它在哈希中的重點。

它記錄在這裏:http://msdn.microsoft.com/en-us/library/system.security.cryptography.randomnumbergenerator.aspx

using System.Security.Cryptography; 

using(RandomNumberGenerator rng = new RandomNumberGenerator()) { 

    Byte[] bytes = new Byte[8]; 
    rng.GetBytes(bytes); 

    String sendThisInEmailAndStoreInDB = Convert.ToBase64String(bytes); 
} 
1

比使用隨機數更好的是鹽,然後哈希值。這是從安全大師的一個片段:

@using System.Security.Cryptography; 
static byte[] GenerateSaltedHash(byte[] plainText, byte[] salt) 
{ 
HashAlgorithm algorithm = new SHA256Managed(); 

byte[] plainTextWithSaltBytes = 
    new byte[plainText.Length + salt.Length]; 

for (int i = 0; i < plainText.Length; i++) 
{ 
    plainTextWithSaltBytes[i] = plainText[i]; 
} 
for (int i = 0; i < salt.Length; i++) 
{ 
    plainTextWithSaltBytes[plainText.Length + i] = salt[i]; 
} 

return algorithm.ComputeHash(plainTextWithSaltBytes);    
} 

你可以看到更多的關於他的答案在這裏:https://stackoverflow.com/a/2138588/1026459

基本上只是創建一個密碼。在這裏使用salt並散列它,然後在用戶返回時進行比較。鏈接的答案還包含比較方法和更深入的salt/hashing解釋。

1

其實,我不會做任何這些。

我面臨同樣的問題,我決定發送重置令牌並執行此操作,我使用了JWT令牌。

在該令牌上(已加密),您可以設置過期時間。只需創建一個包含Customers電子郵件地址的重置令牌作爲聲明,然後設置到期日期,將其存儲在數據庫中(以其加密形式)並對其進行編碼並將其作爲URL參數放置在鏈接上。

然後,當您收到請求時,您可以驗證令牌是否有效。然後,您可以解壓縮它,查看電子郵件地址,然後繼續將其引導至您的安全密碼重置區域以查找其帳戶。 (您可以包含其他聲明,如用戶名等)。

要獲得implemnetation您可以鍵入Install-Package JWT

+0

您將如何調試此令牌?可以提取這種令牌中的所有信息:電子郵件,有效日期...... –