如何创建密码重置链接?

时间:2012-09-25 00:05:02

标签: c# asp.net-mvc security forgot-password password-recovery

您建议在MVCC#中建立安全密码重置链接的哪种方式?我的意思是,我会创建一个随机令牌,对吗?如何在发送给用户之前对其进行编码? MD5 足够好吗?你知道其他任何安全方式吗?

4 个答案:

答案 0 :(得分:17)

使用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 :(得分:2)

我认为您不需要为此目的使用加密字符串。我认为用 Guid 创建一个字符串就足够了。

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

将该数据保存在您的数据库表中,以防止该特定用户帐户。为具有此字符串的用户创建链接并将其发送给他们。当他们点击它时,它会将它们带到一个动作方法,并且你得到与我们存储的这个临时字符串相关的相应用户记录,并显示用户更新密码的表格。

如果您怀疑Guid是否独一无二,请结帐this

答案 2 :(得分: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

基本上只需创建一个密码。在这里加盐并哈希,然后在用户返回时进行比较。链接的答案还包含比较方法和更深入的盐/散列说明。

答案 3 :(得分:1)

实际上,我不会做任何这些。

我遇到了同样的问题,我决定发送一个重置令牌,为此,我使用了一个JWT令牌。

在该令牌(已加密)上,您可以设置到期日。只需创建一个包含客户电子邮件地址作为索赔的重置令牌,然后设置您的到期日期,将其存储在您的数据库中(以加密形式)并对其进行编码并将其作为URL参数放在链接上。

然后,当您收到请求时,您可以验证令牌是否有效。然后,您可以将其解压缩,然后查看电子邮件地址,然后将其指向您的帐户的安全密码重置区域。 (您可以包含其他声明,例如用户名等)。

要获得JWT实施,您可以输入Install-Package JWT