使用用户名密码和当前时间生成代码

时间:2016-03-22 19:53:58

标签: c# hash

我希望生成一个代码,该代码将根据用户的用户名和密码以及当前分钟生成,这将在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位数代码我必须做什么吗?

1 个答案:

答案 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。