2014-02-20 122 views
0

大部分我已經在這個節目密碼散列/鹽漬密碼比較感興趣的課題。這不是我的用例。我需要從xml文件中讀取散列/鹽漬密碼,然後使用它登錄到Sql數據庫。我需要從Windows服務中執行此操作。我首先不確定如何閱讀XML文件中的條目,然後如何「解密」它?提取/解密散列/鹽漬密碼了XML文件的

的GenerateSaltForPassword和ComputePasswordHash功能直接來自This SO post

private int GenerateSaltForPassword() 
     { 
      RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 
      byte[] saltBytes = new byte[4]; 
      rng.GetNonZeroBytes(saltBytes); 
      return (((int) saltBytes[0]) << 24) + (((int) saltBytes[1]) << 16) + (((int) saltBytes[2]) << 8) + 
        ((int) saltBytes[3]); 
     } 

     private byte[] ComputePasswordHash(string password, int salt) 
     { 
      byte[] saltBytes = new byte[4]; 
      saltBytes[0] = (byte) (salt >> 24); 
      saltBytes[1] = (byte) (salt >> 16); 
      saltBytes[2] = (byte) (salt >> 8); 
      saltBytes[3] = (byte) (salt); 

      byte[] passwordBytes = UTF8Encoding.UTF8.GetBytes(password); 

      Byte[] preHashed = new Byte[saltBytes.Length + passwordBytes.Length]; 
      System.Buffer.BlockCopy(passwordBytes, 0, preHashed, 0, passwordBytes.Length); 
      System.Buffer.BlockCopy(saltBytes, 0, preHashed, passwordBytes.Length, saltBytes.Length); 

      SHA1 sha1 = SHA1.Create(); 
      return sha1.ComputeHash(preHashed); 
     } 

,並通過生成的XML文件:

private void btnSave_Click(object sender, System.EventArgs e) 
     { 
      int salt = GenerateSaltForPassword(); 

      string fileName = System.IO.Path.Combine(Application.StartupPath, "alphaService.xml"); 
      XDocument doc = new XDocument(); 
      XElement xml = new XElement("Info", 
       new XElement("DatabaseServerName", txtServerName.Text), 
       new XElement("DatabaseUserName", txtDatabaseUserName.Text), 
       new XElement("DatabasePassword", ComputePasswordHash(txtDatabasePassword.Text, salt)), 
       new XElement("ServiceAccount", txtAccount.Text), 
       new XElement("ServicePassword", ComputePasswordHash(txtServicePassword.Text, salt))); 

      doc.Add(xml); 
      doc.Save(fileName); 
     } 
+2

如果我理解正確,您的要求,你不能。哈希是一種單向過程,意味着您不能(以編程方式)恢復(或解密)原始值。這就是它用於存儲密碼的原因。 –

+0

我不明白。如果它用於存儲密碼,則必須有一種方法來使用該密碼。我應該做什麼?無論如何,我怎樣才能從XML中提取這個值呢? – user2471435

+0

讀它很簡單,但最終的結果是沒用的。你最終會得到一個你不能用來連接的密碼。讀它,這樣做:'的XDocument DOC = XDocument.Load(pathToXml 「);字符串密碼= doc.Descendants(」 DatabasePassword「)FirstOrDefault()值;' –

回答

3

正如安德烈正確地指出,散列密碼的全部意義在於使密碼不能被檢索。這是一個非常標準的技術,可以幫助保護萬一密碼文件被黑客竊取。使用此文件的方式是當用戶嘗試進行身份驗證時,從DB讀取salt(或者在您的情況下使用XML),將其添加到輸入的密碼中,方法與設置密碼的方式相同(在您的代碼中,它被附加到密碼字節),然後將結果散列與存儲的散列進行比較。如果相同,用戶輸入正確的密碼,否則密碼不正確。因此可以完成密碼驗證,但密碼本身無法恢復。

現在,如果不使用鹽或弱鹽,可能會使用rainbow tables反向散列回來,但這更多是一種黑客技術,不適合您的目的。

所以它的短,你不能從哈希值作爲這就是爲什麼它首先被散列的原因恢復密碼。

+0

謝謝。。你這是一個設置/配置實用程序的一部分。那麼,如何做到不存儲在XML文件中明確測試的密碼,然後用它來建立在已安裝的Windows服務的連接字符串的目標是什麼? – user2471435

+0

去一你是否考慮過使用可信連接(如果它是SQLServer)來進行身份驗證?如果受信任不是一個選項,那麼你需要考慮加密而不是散列,並且在存儲中加密你的密碼。需要存儲的關鍵地方來解密,如果你在代碼中做到這一點,它可以很容易地與像展鵬的.net反射或JetBrains公司dotPeak公用事業檢索。[本文](http://msdn.microsoft.com/ EN-US /李brary/zhhddkxy(v = vs.100).aspx)可能會有所幫助。 – LB2

+0

我試圖尋找到加密這裏>/a> – user2471435