【发布时间】:2014-02-20 14:48:56
【问题描述】:
我在本节目中读到的大部分主题都是将密码与散列/加盐密码进行比较。那不是我的用例。我需要从 xml 文件中读取散列/加盐密码,然后使用它登录 Sql 数据库。我需要从 Windows 服务中执行此操作。我首先不确定如何读取 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 中提取该值?
-
读起来很简单,但最终的结果是没用的。您最终会得到一个您将无法用于连接的实际密码的哈希值。要阅读它,请执行以下操作:
XDocument doc = XDocument.Load(pathToXml"); string password = doc.Descendants("DatabasePassword").FirstOrDefault().Value;. -
感谢 XML 代码。
标签: c# xml encryption hash