2010-08-02 46 views

回答

2

VARCHAR應該足夠了。在我看來,VARCHAR數據會更容易消耗,並且與二進制文件一起工作。

內置的ASP.NET成員資格提供程序還將散列密碼存儲爲VARCHAR字段。

2

如果使用VARCHAR,請確保字節是有效字符或在保存哈希和鹽之前強制字節爲ASCII。爲了使數據損壞更安全,您可能需要先將這些字節以Base64或十六進制編碼,然後再將它們存儲在VARCHAR字段中。

例如,如果存儲從MD5SHA1byte[]輸出部分的字節值可以被移除或更換時byte[]被轉換爲文本是它們不是有效的UTF-8/Unicode的。如果您使用ASCII,這應該不會成爲問題,但它仍可能導致數據損壞。

如果您不想處理Hex,您可以使用此框架內置的base64方法Convert.ToBase64String

如果使用VARBINARY並且不嘗試使用和文本編碼方法,則不應該存在此問題,但可能會使比較哈希更困難。

...請注意,如果您使用NVARCHAR還是會出現這種數據損壞...

static void Main(string[] args) 
{ 
    var salt = "MySalt"; 
    var password = "MyPassword"; 

    var saltedKey = CalculateHash(salt, password); 

    Console.WriteLine(saltedKey); 
    // MySalt$teGOpFi57nENIRifSW3m1RQndiU= 

    var checkHash = CheckHash(saltedKey, password); 
    Console.WriteLine(checkHash); 
    // True 
} 

private static string CalculateHash(string saltOrSaltedKey, string password) 
{ 
    var salt = 
     saltOrSaltedKey.Contains('$') 
     ? saltOrSaltedKey.Substring(0, saltOrSaltedKey.IndexOf('$') + 1) 
     : saltOrSaltedKey + '$'; 

    var newKey = Encoding.UTF8.GetBytes(salt + password); 

    var sha1 = SHA1.Create(); 
    sha1.Initialize(); 
    var result = sha1.ComputeHash(newKey); 

    // if you replace this base64 version with one of the encoding 
    // classes this will become corrupt due to nulls and other 
    // control character values in the byte[] 
    var outval = salt + Convert.ToBase64String(result); 

    return outval; 
} 

private static bool CheckHash(string saltedKey, string password) 
{ 
    var outval = CalculateHash(saltedKey, password); 
    return outval == saltedKey; 
} 
1

最MD5/SHA1庫返回哈希的base64在這種情況下,爲varchar就足夠了

相關問題