【发布时间】:2016-07-16 23:17:56
【问题描述】:
我正要为我目前正在开发的网站编写一个新的加密系统,如果可能的话,我想看看我是否可以在开始之前让某人对其进行感应检查!
更新: 我原来的问题应该更清楚。我需要加密一些用户数据,我还需要能够在以后的数据中读取这些数据。而且,我还需要存储用户密码或密码的哈希值,以便在登录时验证用户。
计划是:
主密钥:创建一个 DPAPI 密钥设置器应用程序以获取基于文本的主密钥,通过 DPAPI 进行加密,然后将加密的输出保存到服务器上的文本文件中。这是我每次将站点移动到新服务器时都会执行的一次性任务。主密钥将用于执行 AES 加密。
-
新用户注册时:
2.1。保存密码数据/密码数据的哈希。
2.2。加载主密钥文件,使用 DPAPI 解密密钥。使用解密的主密钥和每个用户数据的新随机 IV 来创建 AES 加密字符串。通过在加密字符串前加上相应的随机IV来保存每个加密字符串,并插入到数据库中的varchar列中。
-
用户登录时:
3.1。匹配密码哈希以验证用户。
3.2。对于每个加密的用户数据字段,将内容分成两部分:IV 和加密数据。从 DPAPI 和 IV 中获取主密钥,解密数据并显示在屏幕上。
听起来怎么样?以上有什么明显的缺陷吗?
我是新来的,过去曾使用 Enterprise Library Security 来处理这类东西(.NET core 中不再提供它!),所以任何帮助都将不胜感激!
【问题讨论】:
-
散列通常比加密密码更好。
-
不要加密密码,当攻击者得到数据库时,他也会得到加密密钥。使用随机盐在 HMAC 上迭代大约 100 毫秒,然后将盐与哈希一起保存。使用 password_hash、PBKDF2、Bcrypt 等函数和类似函数。关键是让攻击者花费大量时间通过蛮力寻找密码。有关更多信息,请参阅@bartonjs 的答案。
-
我知道使用散列是个好主意,但在这种情况下 - 黑客不会从数据库中获取加密密钥,因为密钥本身将使用 DPAPI 加密。话虽如此,我还是打算使用密码散列,并将 DPAPI + aes 用于非密码用户字段
标签: c# .net encryption aes dpapi