2012-09-25 49 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

您将如何调试此令牌?可以提取这种令牌中的所有信息:电子邮件,有效日期...... –