目前我这样做:
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)
答案 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"));
}
这表示一个字符串,而不是使用位转换器,它直接是字节的字符串表示(并且不能轻易地反转回位)。
一些笔记(请阅读此):
另外注意,在您的实现中,您可以访问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的回答。
Encoding.Default
。除非您有充分的理由不这样做,否则请始终使用UTF-8 en / de-coding。使用.NET System.Text
命名空间很容易。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