2014-12-02 297 views
0

我用下面的代碼如何SHA512哈希值進行解密,以實際字符串在C#

HashAlgorithm hashAlgorithm = null; 
hashAlgorithm = new SHA512CryptoServiceProvider(); 
try 
{ 
    byte[] byteValue = Encoding.UTF8.GetBytes(source); 
    byte[] hashValue = hashAlgorithm.ComputeHash(byteValue); 

    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i <= hashValue.Length - 1; i++) 
    { 
     sb.AppendFormat("{0:x2}", hashValue[i]); 
    } 

    return Convert.ToString(sb); 
} 
catch 
{ 
    throw; 
} 
後,我在數據庫中保存它

加密密碼。 現在我想通過解密來檢索實際的密碼。請幫我

+0

你誤會了哈希的作用。請閱讀http://en.wikipedia.org/wiki/Cryptographic_hash_function – 2014-12-02 09:57:24

+1

一個聰明的傢伙說:「如何從牛漢堡中取出活牛?」。 – C4u 2014-12-02 10:06:41

+0

另一個問題是,像SHA-2這樣的常規加密哈希不是您想要爲密碼哈希做的。你想要一個緩慢的鹽漬散列。有關詳細信息,請參閱security.se上的[如何安全地哈希密碼?](http://security.stackexchange.com/questions/211/how-to-securely-hash-passwords)。 – CodesInChaos 2014-12-02 16:54:44

回答

2

hash一個密碼,你沒有encrypt它。這就是說你不能decrypt它。

here

加密將數據取入另一種格式中,使得只有特定 個體(一個或多個)可以逆轉轉化的方法。它使用一個祕密的密鑰 與明文和 算法一起執行加密操作。因此,全部需要密文,算法和密鑰才能返回到明文文本 。

散列提供保證完整性,即使它如此 ,如果事情被改變,你可以知道,它改變的目的。 技術上,散列取任意的輸入,併產生一個固定長度的串 具有以下屬性:

  1. 相同的輸入總是會產生相同的輸出。
  2. 多個不同的輸入不應該產生相同的輸出。
  3. 應該不可能從輸出轉到輸入。
  4. 給定輸入的任何修改都會導致哈希值的劇烈變化。

散列是與認證 一起使用,以產生強烈的證據表明, 給定的消息沒有被修改。這是通過給定輸入 ,使用給定密鑰對其進行加密,對其進行散列,然後使用收件人的公鑰對密鑰進行加密並將帶有發件人私鑰的哈希簽署爲 來實現的。

那麼我可以用什麼來將輸出轉換爲輸入?

你應該解密你的數據,而不是散列它們。加密和解密數據是一個很大的課題。一個好的起點是閱讀this。通常,您有兩種類型的加密選項,對稱和不對稱。所以最初,請閱讀有關它們,然後選擇一種您認爲適合您需要的產品。然後嘗試實施它。您將使用已經在.NET中實現的算法,並且可以使用實例化相應類的對象並調用特定方法。

但是,我必須在這裏做一個說明。通常,我們對密碼進行哈希處理,而不對它們進行加密。這更安全。從here摘自:

雖然散列和加密既提供有價值的功能,爲 絕大多數情況下,只有一個 存儲用戶密碼的在線應用正確的選擇:散列這是一個 單向函數其中哈希值不能顛倒以獲得 原始輸入值(即,密碼)。基於使用加密密鑰的對稱加密是 ,並且是可逆操作。 擁有密鑰的任何人都可以解密加密值以獲得原始值。

+0

那麼我可以用什麼來將輸出轉換爲輸入? – 2014-12-02 10:06:27

+0

如果你認真地問這個問題,請再次閱讀這個答案。否則谷歌進行暴力或字典攻擊。 – C4u 2014-12-02 10:08:13

+0

@NituBansal請參閱我的更新。 – Christos 2014-12-02 10:14:07