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