大部分我已經在這個節目密碼散列/鹽漬密碼比較感興趣的課題。這不是我的用例。我需要從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);
}
如果我理解正確,您的要求,你不能。哈希是一種單向過程,意味着您不能(以編程方式)恢復(或解密)原始值。這就是它用於存儲密碼的原因。 –
我不明白。如果它用於存儲密碼,則必須有一種方法來使用該密碼。我應該做什麼?無論如何,我怎樣才能從XML中提取這個值呢? – user2471435
讀它很簡單,但最終的結果是沒用的。你最終會得到一個你不能用來連接的密碼。讀它,這樣做:'的XDocument DOC = XDocument.Load(pathToXml 「);字符串密碼= doc.Descendants(」 DatabasePassword「)FirstOrDefault()值;' –