2013-02-01 157 views
1

當前我正在使用salt來加密密碼。在C中使用salt解密密碼#

public static SaltedHash Create(string password) 
     { 
      string salt = _createSalt(); 
      string hash = _calculateHash(salt, password); 
      return new SaltedHash(salt, hash); 
     } 

private static string _createSalt() 
     { 
      byte[] r = _createRandomBytes(SALT_LENGTH); 
      return Convert.ToBase64String(r); 
     } 
private static byte[] _createRandomBytes(int len) 
     { 
      byte[] r = new byte[len]; 
      new RNGCryptoServiceProvider().GetBytes(r); 
      return r; 
     } 
private static string _calculateHash(string salt, string password) 
     { 
      byte[] data = _toByteArray(salt + password); 
      byte[] hash = _calculateHash(data); 
      return Convert.ToBase64String(hash); 
     } 
private static byte[] _toByteArray(string s) 
     { 
      return System.Text.Encoding.UTF8.GetBytes(s); 
     } 
private static byte[] _calculateHash(byte[] data) 
     { 
      return new SHA1CryptoServiceProvider().ComputeHash(data); 
     } 
/// <summary> 
     /// This method verifies a password from a SaltedHash class. 
     /// <param name="password">The password to verity</param> 
     /// <returns>Boolean</returns> 
     /// </summary> 
     public bool Verify(string password) 
     { 
      string h = _calculateHash(_salt, password); 
      return _hash.Equals(h); 
     } 
/// <summary> 
     /// This method creates a SaltedHash object from a salt and hash value. 
     /// <param name="salt">Salt value</param> 
     /// <param name="hash">Hash value</param> 
     /// <returns>SaltedHash class</returns> 
     /// </summary> 
     public static SaltedHash Create(string salt, string hash) 
     { 
      return new SaltedHash(salt, hash); 
     } 

現在加密很好。 現在使用相同的技術我想解密密碼。

如何做到這一點? 謝謝。

+0

您不應該將鹽轉換爲基本64字符串。您正在將鹽中的可能字符減少到65,而不是256.這會大大削弱您的鹽的效果。您必須將密碼轉換爲字節數組,然後應用二元鹽。 – Sefe

回答

9

你是不是加密的密碼,你是哈希它。

散列的思想是,它是一種單向函數,從原始文本創建散列時計算起來很便宜,但是在開始散列時計算起來很昂貴,最後以純文本結束,從而產生散列值。

儘管存在各種破壞SHA1(您的散列算法)的攻擊,但沒有直接的方法來「解密」散列值(引號中的「解密」意味着找到對應於醃製,散列的輸入值產值)。

如果您確實想要加密文本,請查看諸如AES(也由.NET框架支持)等算法。

+1

關於哈希與加密的簡短但很棒的文章可以在[這裏]找到(http://enterprisefeatures.com/2011/08/what%E2%80%99s-the-difference-between-hashing-and-encryption/comment以及在OP需要更好地理解差異的情況下。 –