在C中使用salt解密密码#
问题描述:
当前我正在使用salt来加密密码。在C中使用salt解密密码#
public static SaltedHash Create(string password)
{
string salt = _createSalt();
string hash = _calculateHash(salt, password);
return new SaltedHash(salt, hash);
}
private static string _createSalt()
{
byte[] r = _createRandomBytes(SALT_LENGTH);
return Convert.ToBase64String(r);
}
private static byte[] _createRandomBytes(int len)
{
byte[] r = new byte[len];
new RNGCryptoServiceProvider().GetBytes(r);
return r;
}
private static string _calculateHash(string salt, string password)
{
byte[] data = _toByteArray(salt + password);
byte[] hash = _calculateHash(data);
return Convert.ToBase64String(hash);
}
private static byte[] _toByteArray(string s)
{
return System.Text.Encoding.UTF8.GetBytes(s);
}
private static byte[] _calculateHash(byte[] data)
{
return new SHA1CryptoServiceProvider().ComputeHash(data);
}
/// <summary>
/// This method verifies a password from a SaltedHash class.
/// <param name="password">The password to verity</param>
/// <returns>Boolean</returns>
/// </summary>
public bool Verify(string password)
{
string h = _calculateHash(_salt, password);
return _hash.Equals(h);
}
/// <summary>
/// This method creates a SaltedHash object from a salt and hash value.
/// <param name="salt">Salt value</param>
/// <param name="hash">Hash value</param>
/// <returns>SaltedHash class</returns>
/// </summary>
public static SaltedHash Create(string salt, string hash)
{
return new SaltedHash(salt, hash);
}
现在加密很好。 现在使用相同的技术我想解密密码。
如何做到这一点? 谢谢。
答
你是不是加密的密码,你是哈希它。
散列的思想是,它是一种单向函数,从原始文本创建散列时计算起来很便宜,但是在开始散列时计算起来很昂贵,最后以纯文本结束,从而产生散列值。
尽管存在各种破坏SHA1(您的散列算法)的攻击,但没有直接的方法来“解密”散列值(引号中的“解密”意味着找到对应于腌制,散列的输入值产值)。
如果您确实想要加密文本,请查看诸如AES(也由.NET框架支持)等算法。
+1
关于哈希与加密的简短但很棒的文章可以在[这里]找到(http://enterprisefeatures.com/2011/08/what%E2%80%99s-the-difference-between-hashing-and-encryption/comment以及在OP需要更好地理解差异的情况下。 –
您不应该将盐转换为基本64字符串。您正在将盐中的可能字符减少到65,而不是256.这会大大削弱您的盐的效果。您必须将密码转换为字节数组,然后应用二元盐。 – Sefe