使用 SHA1 的密码加密会产生奇怪的输出

Password encryption with SHA1 gives weird output

所以我在 visual studio 上编写了一个简单的登录注册 windows 应用程序,因为我想重新开始学习 C# 我有这个带有几个字段的注册页面,代码很简单,我没有做任何与验证相关的事情。 我基本上是尝试在 C# 中使用 SHA1 散列密码并在另一个文本框中输出,但我得到了一些未知字符

这是我的代码

private void button1_Click(object sender, EventArgs e)
    {
        if (username.Text.Trim()=="" || password.Text=="" ||     passwordc.Text=="" || fname.Text == "" || lname.Text == "" || birthday.Text ==    "")
        {
            MessageBox.Show("Please fill all the fields!");

        }
        else if (password.Text!=passwordc.Text) {
            MessageBox.Show("Passwords don't match !");             
        }

        else
        {
            String passwd="";
            passwd = password.Text;


            byte[] bytes = System.Text.Encoding.UTF8.GetBytes(passwd);
            SHA1 sha = new SHA1CryptoServiceProvider();
            byte[] passbyte = sha.ComputeHash(bytes);
            string pass = System.Text.Encoding.UTF8.GetString(passbyte);
            textBox1.Text = pass;

        }

https://i.stack.imgur.com/SOPit.png

有什么问题吗?或者这是正常的散列?我现在有点困惑。

谢谢

散列只是一堆字节。他们不是有意义的角色。如果你想把散列变成文本形式,你可以使用Convert.ToBase64String():

string pass = Convert.ToBase64String(passByte);

另外,考虑改用 SHA256。随着计算能力的提高,SHA1 变得越来越容易破解。一件常见的事情是 运行 哈希过程(新哈希成为要哈希的密码)数百或数千次,然后再存储它。创建要存储的散列在时间上不会有太大差异,但它会使破解密码的时间延长很多倍。

此外,您需要开始将随机盐加入到每个要散列的密码中。这避免了彩虹 table 攻击,并且不会为相同的密码生成相同的哈希值。