我希望生成一个代码,该代码将根据用户的用户名和密码以及当前分钟生成,这将在Windows窗体应用程序上完成,然后我在网站上重复相同的代码,并且当用户尝试登录时,如果匹配,将要求他们输入此验证码,他们将登录。
我搜索但无法找到从散列字符串生成4位数代码的方法
public static string HashSHA512String(string Username, string Password)
{
string AllString = Username + Password + DateTime.UtcNow.Minute;
if (string.IsNullOrEmpty(AllString)) throw new ArgumentNullException();
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(AllString);
buffer = System.Security.Cryptography.SHA512Managed.Create().ComputeHash(buffer);
return System.Convert.ToBase64String(buffer).Substring(0, 86);
}
这是我迄今为止所做的事情,我希望将这个长字符串转换为4位数代码。你能告诉我为了生成这个4位数代码我必须做什么吗?
答案 0 :(得分:0)
修改您的代码如下......
public static int HashSHA512String(string Username, string Password)
{
const int RandomFactor = 27; // Added this to make the code appear more "random".
string AllString = Username + Password + DateTime.UtcNow;
if (string.IsNullOrEmpty(AllString)) throw new ArgumentNullException();
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(AllString);
buffer = System.Security.Cryptography.SHA512Managed.Create().ComputeHash(buffer);
int code = 0;
for (var i = 0; i < buffer.Length; i++)
{
code += buffer[i] * RandomFactor;
code = code % 10000;
}
return code;
}
这将返回一个介于0和9999之间的代码。然后,您可以从此代码创建一个零左填充字符串。
我建议使用完整的日期,而不仅仅是哈希的分钟给你随机的结果,也可能有一些盐。
如果您希望将从上面返回的int转换为四位数字符串代码,请使用此...
public static string PadInt(int value)
{
var output = value.ToString();
while (output.Length < 4)
{
output = "0" + output;
}
return output;
}
您可以在上面的Hashing方法中调用它,然后只返回字符串,而不是int。