【问题标题】:How to encrypt and verify password in asp.net using C#?如何使用 C# 在 asp.net 中加密和验证密码?
【发布时间】:2018-08-06 15:04:51
【问题描述】:

我使用以下教程将密码散列到我的数据库。我想在这里问一下更有经验的开发人员,这种方法是否仍然“最新”?我不想遇到安全问题。

这里是有问题的链接:How to encrypt and decrypt password in asp.net using C#?。我修改了一点代码,使其始终使用 SHA512 作为哈希算法。我也从不指定盐,而是让它生成它(第二个参数 = null)。

提前感谢您的帮助,祝大家有个愉快的一周!

问候

【问题讨论】:

  • 您永远不会想要“解密”密码的能力。密码经过散列(和加盐),这是一种单向功能。
  • 简短回答:你不知道。长答案:你散列密码(你不能解密散列)。进入哈希算法的相同数据会产生相同的结果,这就是您验证密码的方式。
  • 教程的标题可能并不完美,但如果你看一下你会发现它是一种验证密码正确的方法,而不是解密它。编辑:我更新了标题;)
  • 请提出一个独立的问题。使用异地链接很难保持质量。这里的任何答案基本上都是网站上的评论。如果该网站出现故障或被修改,答案就会过时甚至误导。
  • 关于它是否“最新”的问题可能更适合Security StackExchange 并且似乎有一个不错的答案here

标签: c# asp.net encryption password-encryption password-hash


【解决方案1】:

如果这个方法仍然是“最新的”?

一般来说是的。

我也从不指定盐,而是让它生成它(第二个参数 = null)。

是的。现在像十万次一样散列,你没事;)不是开玩笑。我认为最小值应该在附近 - 嗯,它应该需要一秒钟才能运行。

现在,这是您实际上从未问过的问题,除了您的头衔。你如何验证?

不是通过解密。

  • 获取用户输入的密码。
  • 从您的加盐密码中提取盐(是的,存储它)
  • 从您的加盐密码中获取迭代次数
  • 用户使用相同算法输入相同次数的盐。
  • 比较两个哈希值。

完成。

哈希不是加密。 Envcryption 意味着您可以解密 - 哈希是不可逆的。

【讨论】:

  • 感谢您的评论!您对以下内容是什么意思:“是的。现在散列十万次,你就没事了;)不是开玩笑。我认为最小值应该在附近 - 好吧,它应该需要一秒钟的时间来操作。 ?恐怕我没听懂你的笑话 xD。
  • 这意味着是的,当我告诉你散列它十万次而不是一次时,我是认真的。是的,它很慢——这就是全部原因。对其进行哈希处理,获取输出,然后在循环中再次对其进行哈希处理,直到。有多频繁?在高端 CPU 上大约需要一秒钟。
  • 让方法生成盐大小可以吗?我个人使用 16 到 24 之间的盐分。
  • 多次散列有什么好处?
  • 字典攻击。具有预先计算的哈希值。那你是怎么做到的?
【解决方案2】:

由于我是 asp.net 初学者来回答这个问题,我使用了以下代码,可以帮助您在哪里加密密码并保存到 db,当从 db 检索加密字符串时,然后解密以匹配您的验证密码。以下代码已针对您的 (pwd) 密码进行测试。

设计文件

<form id="form1" runat="server">
<div>
    <asp:TextBox ID="TextBox1" Text="Arslan Ali" runat="server" placeHolder="Enter Password"></asp:TextBox><br />
    <asp:Button ID="Button1" runat="server" Text="Encrypt" OnClick="Button1_Click" /><br />
    <asp:Button ID="Button2" runat="server" Text="Decrypt" OnClick="Button2_Click" /><br />
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><br />
</div>
</form>

在您的代码文件中所需的命名空间

using System.Text;
using System.Security.Cryptography;

定义哈希字符串

    string hash = @"foxle@rn";

加密

protected void Button1_Click(object sender, EventArgs e)
{
    byte[] data = UTF8Encoding.UTF8.GetBytes(TextBox1.Text);
    using(MD5CryptoServiceProvider md5=new MD5CryptoServiceProvider())
    {
        byte[] keys = md5.ComputeHash(UTF8Encoding.UTF8.GetBytes(hash));
        using (TripleDESCryptoServiceProvider tripleDes = new TripleDESCryptoServiceProvider() {Key=keys,Mode=CipherMode.ECB,Padding=PaddingMode.PKCS7 })
        {
            ICryptoTransform transform=tripleDes.CreateEncryptor();
            byte[] results=transform.TransformFinalBlock(data,0,data.Length);
            Label1.Text = Convert.ToBase64String(results);
        }
    }
}

解密

protected void Button2_Click(object sender, EventArgs e)
{
    byte[] data = Convert.FromBase64String(Label1.Text);
    using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
    {
        byte[] keys = md5.ComputeHash(UTF8Encoding.UTF8.GetBytes(hash));
        using (TripleDESCryptoServiceProvider tripleDes = new TripleDESCryptoServiceProvider() { Key = keys, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 })
        {
            ICryptoTransform transform = tripleDes.CreateDecryptor();
            byte[] results = transform.TransformFinalBlock(data, 0, data.Length);
            Label1.Text = UTF8Encoding.UTF8.GetString(results);
        }
    }
}

我希望如此,它可能会对你有所帮助,但我要确认,我对加密以及 asp.net 网络表单太初学者了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 2017-12-26
    • 1970-01-01
    • 2011-08-29
    • 2012-01-22
    相关资源
    最近更新 更多