从XML文件中提取/解密哈希/盐渍密码

时间:2014-02-20 14:48:56

标签: c# xml encryption hash

我在此节目中阅读的大多数主题都将密码与散列/加密密码进行比较。那不是我的用例。我需要从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);
        }

1 个答案:

答案 0 :(得分:3)

正如安德烈正确指出的那样,哈希密码的全部意义在于无法检索密码。这是一种非常标准的技术,可以帮助防止密码文件被盗(黑客)。使用此文件的方式是当用户尝试进行身份验证时,从DB(或在您的情况下为XML)中读取salt,添加到输入密码的方式与设置密码时相同(在您的代码中将其附加到密码字节),然后将得到的哈希与存储的哈希进行比较。如果相同,用户输入正确的密码,否则密码不正确。因此可以进行密码验证,但密码本身无法恢复。

现在,如果不使用盐或弱盐,可以使用rainbow tables反向哈希反向,但这更像是一种黑客攻击技术,并不适用于您的目的。

如此短缺,你无法从哈希中恢复密码,因为这就是为什么它首先被哈希的原因。