我正在开发一个(非高安全性)项目,该项目目前尚未上线,但可能会在某个时候上线。
我们有一个在服务器和一个 Android 客户端应用程序上运行的 REST API(使用 Restlet 和 Neo4j 实现)。
为了保持无状态,我们需要将身份验证信息与每个请求一起发送。我们决定使用基于 MAC 的方法:我们使用 HMAC-SHA256 算法对一组标头值以及每个 HTTP 请求的实体主体进行签名。然后,我们将该哈希与用户名放在Authorization请求的标头中。
对于 HMAC 机密,我们使用用户选择的密码。为了使事情更安全,我们在使用密码之前对密码进行哈希处理并将其存储在客户端中。
当然,为了让服务器能够验证 HMAC-SHA256 标头,我们需要传输一次秘密。但由于这种情况只发生一次,因此安全风险并不大。
此设置的问题是用户密码的安全存储。我知道在不使用盐来防止彩虹表攻击的情况下,永远不应该对密码进行哈希处理。但是当我生成一个安全/随机盐时,第一次登录用户的客户端无法访问该盐以生成正确的哈希值。
在这种情况下,最好的决定是什么?我是否应该使用“常规”散列算法(如 SHA256)而不使用盐来简单地存储密码?我想那将是非常疏忽的。我还可以使用更安全的算法,如 bcrypt 或 PBKDF2 和“虚拟盐”,如用户名用户名的 MD5 哈希值和更高的迭代次数。即使知道盐,生成彩虹表也会非常缓慢和痛苦。
使用“隐蔽安全”盐的 bcrypt 是否足够安全?还是整个设置不安全,应该用另一种身份验证方法进行交换?