Hashing

Hashing

Hashing

  • 不可逆

    • 一樣的內容hash出來的結果一定是一樣的

    • 內容不一樣hash出來的值一定不一樣

  • 常見Hashing加密演算法

    • MD5

    • SHA(SHA1, SHA256, SHA384, SHA512)

  • 計算數度快(依據演算法不同)

  • 一般用在儲存密碼、比對檔案和資料篡改檢查

 

這邊以最常見的密碼加密為範例,使用SHA256 + 加鹽的運用,將密碼加密,

再來因為相同內容hash出來的值會一樣的特性,驗證使用者輸入的密碼是否正確。

static void Main(string[] args)
{
    string password = "dnjuey";
    // 密碼加密
    string hashValue = HashPassword(password);
    Console.WriteLine("加密後的hash value:{0}", hashValue);
    // output : 加密後的hash value:QZ+92ih3yGWMLniLsSIW3KNxSyXBta8CD3S51PxvejA=

    // 模仿輸入密碼,驗證密碼是否正確
    string inputPassowrd = "dnjuey";

    if (ValidatePassowd(inputPassowrd, hashValue))
    {
        Console.WriteLine("密碼正確");
    }
    else
    {
        Console.WriteLine("密碼錯誤");
    }
    // output: 密碼正確
}

private static string HashPassword(string password)
{
    const string salt = "SecretSalt";
    
    // 密碼加鹽
    string passwordWithSalt = password + salt;

    // 將加鹽後的密碼轉成Byte
    byte[] passwordWithSaltBytes = Encoding.Default.GetBytes(passwordWithSalt);

    // 選擇SHA256加密演算法
    var hash = new SHA256CryptoServiceProvider();

    // hash 加密
    byte[] hashValue = hash.ComputeHash(passwordWithSaltBytes);

    return Convert.ToBase64String(hashValue);

}

private static bool ValidatePassowd(string password, string hashValue)
{
    string validHashValue = HashPassword(password);

    return validHashValue.Equals(hashValue);
}

.NET都把這些演算法封裝好了,所以我們使用起來就是如此容易。 而MD5、SHA1、SHA2...等等的演算法,用法大同小異,只是使用的class不一樣而已。

 

 

 

一天一分享,身體好健康。

該追究的不是過去的原因,而是現在的目的。