【问题标题】:How do I create a SHA256 Hash with Salt?如何使用 Salt 创建 SHA256 哈希?
【发布时间】:2012-12-16 06:04:12
【问题描述】:

我目前正在开发一个 Visual Studio C# Windows 窗体项目。但是,我对 SHA256 + salted 的工作方式感到困惑。我在网上找到了一些例子,但无法理解如何调用这个函数。

我想在连接到数据库 (Microsoft Access 2010) 的登录表单中调用此函数。

  • 如何通过单击按钮并阅读 来自Textbox 的密码?
  • 如何在 Messagebox.Show 方法? (出于我的测试目的)
  • 有没有可能 比较两个文本(散列和加盐)并给出肯定的结果?

    public static string sha256encrypt(string phrase, string UserName)
    {
        string salt = CreateSalt(UserName);
        string saltAndPwd = String.Concat(phrase, salt);
        UTF8Encoding encoder = new UTF8Encoding();
        SHA256Managed sha256hasher = new SHA256Managed();
        byte[] hashedDataBytes =      sha256hasher.ComputeHash(encoder.GetBytes(saltAndPwd));
        string hashedPwd = String.Concat(byteArrayToString(hashedDataBytes), salt);
        return hashedPwd;
    }
    
    public static string byteArrayToString(byte[] inputArray)
    {
        StringBuilder output = new StringBuilder("");
        for (int i = 0; i < inputArray.Length; i++)
        {
            output.Append(inputArray[i].ToString("X2"));
        }
        return output.ToString();
    }
    
    private static string CreateSalt(string UserName)
    {
        string username = UserName;
        byte[] userBytes; 
        string salt;
        userBytes = ASCIIEncoding.ASCII.GetBytes(username);
        long XORED = 0x00; 
    
        foreach (int x in userBytes)
            XORED = XORED ^ x;
    
        Random rand = new Random(Convert.ToInt32(XORED));
        salt = rand.Next().ToString();
        salt += rand.Next().ToString();
        salt += rand.Next().ToString();
        salt += rand.Next().ToString();
        return salt;
    }
    

如何使用盐创建 SHA256 哈希?

shavalue = (sha256encrypt("password", "username");
saltedandhashtext = CreateSalt(shavalue);

【问题讨论】:

  • 如果不阅读并理解它,我不确定我是否会信任这段代码,因为它调用 SHA-256“加密”并且最多只使用 256不同的盐值...
  • 我不会浪费任何时间让这段代码工作。把它扔掉,然后从新代码开始。特别是使用Rfc2898DeriveBytes,它使用一个拉伸的哈希函数并且可以自己创建一个盐。
  • 由于您正在对密码进行哈希处理,因此您应该考虑使用像 PBKDF2 这样的慢速密钥派生函数,在 CSharp 中它可以使用 Rfc2898DeriveBytes 类来实现,正如 CodesInChaos 已经提到的那样。

标签: c# hash comparison


【解决方案1】:

您要做的是,在单击按钮时,将文本框值和用户名传递给 sha256encrypt 函数,例如:

    private void button1_Click(object sender, EventArgs e)
    {
        sha256encrypt(textBox1.Text, "SampleUserName");
    }

对于第二个问题,做同样的事情,但使用 Messagebox.Show:

    private void button1_Click(object sender, EventArgs e)
    {
        MessageBox.Show(sha256encrypt(textBox1.Text, "SampleUserName"));
    }

第三点:我不确定您的意思,但是如果您想对文本进行加盐并将其与散列文本进行比较:

if(sha256encrypt("password", "username") == CreateSalt("password"))
   return true;
else
   return false;

或者如果您想手动比较它们:

MessageBox.Show(sha256encrypt("password", "username") + "\n\r" + CreateSalt("password"));

【讨论】:

  • @JanesAbouChleih 你是想就实际问题发帖吗?
【解决方案2】:

关于第一个问题,请查看 CC Inc 的答案。

到第二点: MessageBox.Show(sha256encrypt(textBox1.Text, "SampleUserName"));

3) 是的。

您可以使用== 比较器或string.Equals() 比较两个字符串。

public bool compareHashs(string hash1, string hash2){
   if(hash1.Equals(hash2) //or hash1 == hash2
      return true;
   }else{
      return false;
   }  
}

【讨论】:

    【解决方案3】:
    public string ComputeSHA256Hash(string rawData)
    {
        // Create a SHA256   
        using (SHA256 sha256Hash = SHA256.Create())
        {
            // ComputeHash - returns byte array  
            byte[] bytes = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(rawData));
            // Convert byte array to a string   
            StringBuilder builder = new StringBuilder();
            for (int i = 0; i < bytes.Length; i++)
            {
                builder.Append(bytes[i].ToString("x2"));
            }
            return builder.ToString();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 2020-06-05
      • 1970-01-01
      • 2019-11-10
      • 2010-10-16
      • 2016-07-09
      • 1970-01-01
      相关资源
      最近更新 更多