我需要在Swift加密密码并将其发送到我的web服务器以存储在数据库中。有什么最佳实践吗?我见过AESCrypt.encrypt(userPassword, password: API_AUTH_PASSWORD)
,但我不确定这是否足够(盐等)。此外,在服务器本身上,如何比较用于登录身份验证的散列密码?我正在使用PHP。基本上,我想问的是,在Swift中是否有一种普遍接受的加密方法来对基于php的web服务器上的密码进行哈希和检查。
看这个问题。您应该理解哈希在客户端的含义:
-
Pro:你可以使用更大的轮数,创建一个更强的哈希。
作为参考,1Password至少使用25000轮PBKDF2-HMAC-SHA512。您的用户可能不会使用diceware,所以如果可能的话,您需要更高的计数。
-
Con:你将自己锁定在一个特定的算法中&圆的计算。
哈希输出实际上将成为用户的密码。你以后就不能再调整了。这意味着随着时间的推移,随着计算能力的增加,哈希值会变弱。
此外,由于哈希授予访问您的网站,它应该存储在Keychain中。
使用盐(例如
appname + username
)应该防止服务器破坏影响任何其他站点。正如链接所提到的,您可能仍然希望在服务器上使用"快速"哈希(例如
SHA-512
)。这限制了只有数据库受到损害时的损害。在服务器上,应该以恒定的时间与
hash_equals
比较哈希值。password_compat
有早期PHP版本的代码。
在使用客户端散列时,建议在服务器端使用随机盐。
可选的&更常见的场景是在服务器上执行所有哈希。
对于PHP,请参见password_hash
, password_verify
, password_needs_rehash
。
如果你使用的是旧版本的PHP,有password_compat.
最佳做法是不要将密码存储在数据库中。
您应该执行单向散列函数,例如SHA,并存储散列值。当需要对用户进行身份验证时,对用户输入的密码进行散列,并比较散列后的值。在散列中使用盐值可以进一步提高安全性。