使用 SHA512 对密码进行哈希处理以加密数据

Posted

技术标签:

【中文标题】使用 SHA512 对密码进行哈希处理以加密数据【英文标题】:Use SHA512 to hash a password to encrypt data 【发布时间】:2019-04-21 08:04:19 【问题描述】:

我有一个 C# 应用程序,有时我必须在其中加密一些数据(XML 文件)。基本上,问题是我不能在服务器上或直接在代码中存储任何密钥,因为.NET 应用程序可以很容易地用例如dotPeek 进行反汇编。

所以基本上我的应用程序会加密 XML 文件并将其保存在磁盘上,然后就可以解密它。

我想出了一个主意,每次用户想要加密/解密数据时都要求输入密码。此密码短语将使用 SHA512 进行哈希处理,生成的字节将用作加密数据的密钥。然后如果用户想解密文件,他们会再次被要求输入密码,这个密码用于解密文件(如果用户输入错误的密码可能会失败)。

所以我的第一个问题是:这真的是个好主意吗?

我的第二个问题是关于实施的。我有散列、序列化、反序列化,但我不知道我应该使用哪种加密算法(我猜不是 RSA,因为要加密的数据会很长)然后我可以将密码作为密钥传递给这个算法吗?

【问题讨论】:

您确实知道您刚刚将秘密所在的位置向左移动了一英寸。有人可以查看您的应用程序以查看文件的名称以及密码和/或加密方法是什么。事实上,这对于 SO 来说非常广泛。 @Disaffected1070452 那会怎样?密码仅用于加密/解密,OP从未说过它会被存储 将存储散列密码,而不是真实密码 【参考方案1】:

您偶然发现了密钥派生函数 (KDF) 的想法。您的建议是,有一些不同之处,是一个很好的想法,并且经常使用。一个小问题是单独的 SHA-512 并不是一个好的 KDF。我建议您阅读有关 PBKDF2 的内容(在 .NET 中,实现称为 Rfc2898DeriveBytes)。 bcrypt 和 argon2 等密码哈希也是非常可行的选择。

关于您关于加密算法的问题,AES 目前被认为是“标准”对称加密算法。然而,还有许多其他可行的选择。只要确保您没有使用 DES 或 Triple-DES,它们都是过时的算法。还要确保您使用的是安全阻止模式。 GCM 可以说是“最好的”。

【讨论】:

感谢您的意见。实际上我有一个启示,我考虑过使用ProtectedData.Protect/Unprotect,因为它比每次都输入密码更方便。你怎么看? 我个人会使用您的原始解决方案。 ProtectedData 有一些不受欢迎的细微差别...... 你有关于这些细微差别的资源吗?因为这是我的大学教授的一个项目,他热衷于不输入密码

以上是关于使用 SHA512 对密码进行哈希处理以加密数据的主要内容,如果未能解决你的问题,请参考以下文章

如何为一个密码实现sha 512,md5和salt加密[重复]

数据的加密与签名

登录表单不读取 sha512

什么是Drupal的默认密码加密方法?

使用 SHA-512 和 salt 来散列 MD5 散列密码?

哈希密码,从破碎的方法到现在最安全