保护客户端数据安全
答
您可以使用SHA1等哈希编码您的密码。
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哈希是不可解密的,所以它是一个非常安全的解决方案。
答
您需要决定是否需要重新解密文本。我会建议,至少对于密码来说,你可以使用单向散列。如果你使用盐,你可以使蛮力攻击散列很困难。理想情况下,应为每个密码使用一个单独的随机盐: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 = "ABCDEFGHJKLMNOPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
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方法可用于为您的密码生成盐。关于这类事情,还有很多其他问题。
感谢mindw0rk,伟大的方法来解决我的问题,标题来实现你的结果:-) – sarepta 2012-01-10 19:21:37
哈希是_not_加密 – 2012-01-31 04:45:08
修复了我的术语。尽管这对于提问者来说仍然是一个很好的解决方案。 – carlossless 2012-02-03 09:34:39