在客户端保护数据

时间:2012-01-10 08:28:14

标签: vb.net security authentication

从纯文本文件用户名和密码[写入阅读],但它是保护数据的一种坏方法,还有其他方法可以做到这一点,最有可能的方法是使用IV的加密解密算法。

2 个答案:

答案 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哈希值不可解密,如果没有粗暴的强制执行所有可能性,那么这是一个非常安全的解决方案。