使用密钥将密码编码到MD5

时间:2010-09-10 08:48:53

标签: c# .net hash

目前我这样做:

    public static class Crypto
    {
        public static string Encode(string original)
        {
            var md5 = new MD5CryptoServiceProvider();
            var originalBytes = Encoding.Default.GetBytes(original);
            var encodedBytes = md5.ComputeHash(originalBytes);

            return BitConverter.ToString(encodedBytes);
        }
    }

我听说我应该使用一些键来编码。我是不是该?这需要吗?这该怎么做?

<小时/> 我最终做了这个http://encrypto.codeplex.com/(sha1managed + random salt)

7 个答案:

答案 0 :(得分:6)

你所说的被称为“盐”这是一系列随机数据,你附加到原始的纯文本字符串。这通常用于密码,防止彩虹表/字典攻击。

http://en.wikipedia.org/wiki/Salt_%28cryptography%29

上阅读此内容

对于C#,有一篇好文章:http://www.aspheute.com/english/20040105.asp

答案 1 :(得分:3)

您应该使用Base64编码进行表示。即:

StringBuilder hash = new StringBuilder();

for (int i = 0; i < encodedBytes.Length; i++)
{
    hash.Append(encodedBytes[i].ToString("X2"));
}

这表示一个字符串,而不是使用位转换器,它直接是字节的字符串表示(并且不能轻易地反转回位)。

一些笔记(请阅读此):

  • MD5是一种不可逆的散列函数(并不是很好的)
  • 如果您实际上想要使用基于密钥的加密来加密密码,例如AES,不要。使用散列方法,但使用更强的方法。这里有look at this answer有关加强密码的更多信息。

另外注意,在您的实现中,您可以访问IDisposable界面,即:

public static string Encode(string original)
{
    byte[] encodedBytes;

    using (var md5 = new MD5CryptoServiceProvider())
    {
        var originalBytes = Encoding.Default.GetBytes(original);
        encodedBytes = md5.ComputeHash(originalBytes);
    }

    return Convert.ToBase64String(encodedBytes);
}

答案 2 :(得分:2)

由于SHA被认为比MD5更安全,我建议使用它。

byte[] data = new byte[SALT_SIZE+DATA_SIZE];
byte[] result;
SHA256 shaM = new SHA256Managed();
result = shaM.ComputeHash(salt+data);

答案 3 :(得分:1)

MD5不是加密算法,而是哈希算法,因此不需要密钥。它还意味着您无法反转(/反散列)该过程。散列只能以一种方式工作,并且在必须使用原始(未散列)数据来比较散列时非常有用。

编辑:如果您确实希望以可逆的方式真正加密数据。例如,尝试查看AES加密。

答案 4 :(得分:0)

我在对雪橇的答案的评论中发布了此链接,但值得自己发帖。

http://codahale.com/how-to-safely-store-a-password/

听起来你已经得到了建议来加密你的密码哈希(我认为你把盐称为“密钥”)。这比仅仅哈希更好,因为它使得彩虹表无用。彩虹表采用各种可能的密码(例如,一系列密码,如彩虹有一系列颜色)并预先计算其md5哈希值。然后,要反转md5,只需在表格中查看md5即可。

然而,这个建议很快就会过时。硬件现在足够快,不需要彩虹表:你可以非常快速地计算哈希值,它足够快,每次都可以从头开始强制密码,特别是如果你知道盐。因此,解决方案是使用更加计算成本更高的哈希,这将使暴力更慢。

执行此操作的黄金标准工具是bcrypt

答案 5 :(得分:0)

以下几点可以扩展@Kyle Rozendo的回答。

  1. 您应该避免使用默认编码Encoding.Default。除非您有充分的理由不这样做,否则请始终使用UTF-8 en / de-coding。使用.NET System.Text命名空间很容易。
  2. MD5输出是无约束的二进制数据,无法直接可靠地转换为字符串。您必须使用一种特殊的编码,用于将二进制输出转换为有效的字符串并返回。 @Kyle Rozendo展示了一种方法;您也可以使用System.Convert类中的方法。

答案 6 :(得分:0)

类示例:

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

private static string MD5(string Metin)
{
    MD5CryptoServiceProvider MD5Code = new MD5CryptoServiceProvider();
    byte[] byteDizisi = Encoding.UTF8.GetBytes(Metin);
    byteDizisi = MD5Code.ComputeHash(byteDizisi);
    StringBuilder sb = new StringBuilder();
    foreach (byte ba in byteDizisi)
    {
        sb.Append(ba.ToString("x2").ToLower());
    }
    return sb.ToString();
}

MessageBox.Show(MD5("isa")); // 165a1761634db1e9bd304ea6f3ffcf2b