目前我正在使用一种特定的方案来保护密码,我认为我有一些需要改进的地方。该实现是用 Java 编写的,所以我更喜欢使用 SHA-2 512 作为加密形式。
目前我有一个客户端-服务器模型,所以这些事情可能会发生:
- 客户想要登录,他通过网络使用一次普通的 SHA-2 512 加密发送他的密码。
- 服务器将密码存储在数据库中,例如 SHA-2_512(SHA-2_512(password) + salt),内部 SHA-2_512(password) 是它通过网络接收的“加密”密码。
- 密码检查是在服务器端完成的,没有任何东西可以从服务器泄漏,唯一可能的漏洞是如果有人可以读出我认为的 RAM。
我有这些问题:
当想要破解密码时,攻击者通常会创建冲突攻击。然而,碰撞攻击如何足够?如果密码需要用于其他应用程序,如 Outlook.com、Facebook 或其他应用程序(可能使用另一种盐,因为它们与我的应用程序无关),那么碰撞攻击如何足够呢?你不需要真正的密码吗?
SHA-2 512 是否已经使用迭代?即使是这样,我是否应该更改我的加密方法以自动使用多次迭代以及首选多少次迭代?我还阅读了有关使用随机迭代次数(在一个范围内)的信息,如何确定性地存储随机因子?
我应该在服务器代码中存储每次迭代的系统机密吗?请参阅http://blog.mozilla.org/webappsec/2011/05/10/sha-512-w-per-user-salts-is-not-enough/。我可以存储一个数组,该数组将为每次迭代保存一个静态机密,第 n 个机密用于第 n 次迭代。没有人可以知道这些秘密,它们被计算一次(我猜是加密一些随机字符串),然后基本上存储在服务器的 RAM 中。
目前我将输入的密码从客户端发送到服务器只是 SHA-2_512(密码),这个过程是否应该改进,如果是,如何改进?我不能使用盐,因为客户没有可用的盐。
问候。