C# 从XML文件中提取/解密哈希/加密密码

C# 从XML文件中提取/解密哈希/加密密码,c#,xml,encryption,hash,C#,Xml,Encryption,Hash,我在本期节目中读到的大多数主题都将密码与散列/盐析密码进行了比较。这不是我的用例。我需要从xml文件中读取一个经过哈希/盐析的密码,然后使用该密码登录到Sql数据库。我需要从Windows服务执行此操作。我首先不确定如何读取XML文件中的条目,然后如何“解密”它 GenerateSaltForPassword和ComputePasswordHash函数直接来自: 正如Andrei正确指出的那样,对密码进行哈希运算的全部目的是使密码无法检索。这是一种非常标准的技术,有助于防止密码文件(被黑客)窃取

我在本期节目中读到的大多数主题都将密码与散列/盐析密码进行了比较。这不是我的用例。我需要从xml文件中读取一个经过哈希/盐析的密码,然后使用该密码登录到Sql数据库。我需要从Windows服务执行此操作。我首先不确定如何读取XML文件中的条目,然后如何“解密”它

GenerateSaltForPassword和ComputePasswordHash函数直接来自:


正如Andrei正确指出的那样,对密码进行哈希运算的全部目的是使密码无法检索。这是一种非常标准的技术,有助于防止密码文件(被黑客)窃取。此文件的使用方式是,当用户尝试进行身份验证时,从DB(或在您的示例中为XML)读取salt,并以设置密码时相同的方式将其添加到输入的密码中(在您的代码中,它被附加到密码字节中),然后将生成的哈希与存储的哈希进行比较。如果相同,则用户输入正确的密码,否则输入错误的密码。所以可以进行密码验证,但密码本身无法恢复

现在,如果不使用salt或弱salt,则可以使用反向哈希返回,但这更像是一种黑客技术,不适合您的目的


简而言之,您无法从散列中恢复密码,因为这就是为什么首先对密码进行散列的原因。

正如Andrei正确指出的,对密码进行散列的整个要点是,无法检索密码。这是一种非常标准的技术,有助于防止密码文件(被黑客)窃取。此文件的使用方式是,当用户尝试进行身份验证时,从DB(或在您的示例中为XML)读取salt,并以设置密码时相同的方式将其添加到输入的密码中(在您的代码中,它被附加到密码字节中),然后将生成的哈希与存储的哈希进行比较。如果相同,则用户输入正确的密码,否则输入错误的密码。所以可以进行密码验证,但密码本身无法恢复

现在,如果不使用salt或弱salt,则可以使用反向哈希返回,但这更像是一种黑客技术,不适合您的目的


简而言之,您无法从散列中恢复密码,因为这就是为什么首先对密码进行散列的原因。

正如Andrei正确指出的,对密码进行散列的整个要点是,无法检索密码。这是一种非常标准的技术,有助于防止密码文件(被黑客)窃取。此文件的使用方式是,当用户尝试进行身份验证时,从DB(或在您的示例中为XML)读取salt,并以设置密码时相同的方式将其添加到输入的密码中(在您的代码中,它被附加到密码字节中),然后将生成的哈希与存储的哈希进行比较。如果相同,则用户输入正确的密码,否则输入错误的密码。所以可以进行密码验证,但密码本身无法恢复

现在,如果不使用salt或弱salt,则可以使用反向哈希返回,但这更像是一种黑客技术,不适合您的目的


简而言之,您无法从散列中恢复密码,因为这就是为什么首先对密码进行散列的原因。

正如Andrei正确指出的,对密码进行散列的整个要点是,无法检索密码。这是一种非常标准的技术,有助于防止密码文件(被黑客)窃取。此文件的使用方式是,当用户尝试进行身份验证时,从DB(或在您的示例中为XML)读取salt,并以设置密码时相同的方式将其添加到输入的密码中(在您的代码中,它被附加到密码字节中),然后将生成的哈希与存储的哈希进行比较。如果相同,则用户输入正确的密码,否则输入错误的密码。所以可以进行密码验证,但密码本身无法恢复

现在,如果不使用salt或弱salt,则可以使用反向哈希返回,但这更像是一种黑客技术,不适合您的目的


这么短的时间,您无法从散列中恢复密码,因为这就是为什么它首先被散列的原因。

如果我正确理解您的要求,您就无法恢复密码。散列是一个单向过程,这意味着您不能(“以编程方式”)恢复(或解密)原始值。这就是为什么它被用来存储密码。我不明白。如果它用于存储密码,必须有一种方法来使用该密码。我该怎么办?无论如何,如何从XML中提取该值?读取它很简单,但最终结果是无用的。您将得到一个实际密码的散列,您将无法使用它进行连接。要阅读它,请执行以下操作:
XDocument doc=XDocument.Load(pathToXml”);string password=doc.substands(“DatabasePassword”).FirstOrDefault().Value;
。感谢您提供的XML代码。如果我正确理解您的需求,您就不能这样做。哈希是一个单向过程,意味着您无法(“以编程方式”)恢复(或解密)原始值。这就是为什么它被用于存储密码。我不明白。如果它被用于存储密码,必须有一种方法来使用该密码。我应该怎么做?无论如何,我如何从XML中提取该值?读取它很简单,但最终结果是无用的。你最终会得到实际密码的散列您将无法使用它进行连接。要读取它,请执行以下操作:
XDocument doc=XDocument.Load(pathToXml”);字符串密码=doc.substands(“DatabasePassword”).FirstOrDefault().Value。谢谢你的XML代码。如果我正确理解你的要求,你就不能。散列是一个单向过程,这意味着您不能(“以编程方式”)恢复(或解密)原始值。这就是为什么它被用来存储密码。我不明白。如果它用于存储密码,必须有一种方法
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);
        }
 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);
        }