答案 0 :(得分:1)
您需要决定是否需要再次解密文本。我建议,至少对于密码,你可以使用单向哈希如果你使用盐,你可以使暴力攻击哈希很难。理想情况下,每个密码都应使用单独的随机盐:password + salt = hash。您需要存储salt以及hash,但它可以以纯文本形式存储,因为它不是加密密码。示例实现(使用SHA256):
public class SHA256
{
public static string GetHash(string password, string salt)
{
UTF8Encoding encoder = new UTF8Encoding();
SHA256Managed sha256 = new SHA256Managed();
byte[] hashedDataBytes = sha256.ComputeHash(encoder.GetBytes(salt + password));
return ByteArrayToString(hashedDataBytes);
}
/// <summary>
/// Generates a random 16 character alpha-numeric salt
/// </summary>
/// <returns></returns>
public static string GenerateRandomSalt()
{
const string allowedChars = "ABCDEFGHJKLMNOPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz0123456789";
char[] chars = new char[16];
var rd = new Random((int)DateTime.Now.Ticks);
for (int i = 0; i < 16; i++)
{
chars[i] = allowedChars[rd.Next(0, allowedChars.Length)];
}
return new string(chars);
}
/// <summary>
/// Converts supplied byte array to hex format string.
/// </summary>
/// <param name="inputArray"></param>
/// <returns></returns>
private static string ByteArrayToString(byte[] inputArray)
{
StringBuilder output = new StringBuilder("");
for (int i = 0; i < inputArray.Length; i++)
{
output.Append(inputArray[i].ToString("X2")); //Return in hex format
}
return output.ToString();
}
}
GenerateRandomSalt方法可用于为您的密码生成salt。在SO上有很多其他问题涉及这类事情。
答案 1 :(得分:0)
您可以使用SHA1等HASHES对密码进行编码。
Function getSHA1Hash(ByVal strToHash As String) As String
Dim sha1Obj As New Security.Cryptography.SHA1CryptoServiceProvider
Dim bytesToHash() As Byte = System.Text.Encoding.ASCII.GetBytes(strToHash)
bytesToHash = sha1Obj.ComputeHash(bytesToHash)
Dim strResult As String = ""
For Each b As Byte In bytesToHash
strResult += b.ToString("x2")
Next
Return strResult
End Function
使用它很简单!
Console.Write(getSHA1Hash("password"))
因此,无论何时需要对用户进行身份验证,您都可以使用他的输入密码,使用上述函数计算其哈希值,并确保它与简单的IF子句相同:
if getSHA1Hash(input_password) = HASHED_OLD_PASSWORD then Authenticate()
SHA1哈希值不可解密,如果没有粗暴的强制执行所有可能性,那么这是一个非常安全的解决方案。