iOS - Swift 中的密码加密

iOS - Password Encryption in Swift

我需要在Swift中加密一个密码并将其发送到我的网络服务器以存储在数据库中。有什么最佳做法吗?我看过 AESCrypt.encrypt(userPassword, password: API_AUTH_PASSWORD) 但我不确定这是否足够(加盐等)。此外,在服务器本身上,我将如何比较用于登录身份验证的散列密码?我正在使用 PHP。基本上我问的是 Swift 中是否有普遍接受的加密方法来散列和检查基于 PHP 的网络服务器上的密码。

最佳做法是不要将密码存储在您的数据库中。

您应该执行单向散列函数(例如 SHA)并改为存储散列值。当您需要对用户进行身份验证时,对用户输入的密码进行哈希处理并比较哈希值。在您的哈希值中使用加盐值以进一步提高安全性。

参见this question。您应该了解哈希对客户端的影响:

  • 专业人士:您可以使用更多的轮数,创建更强的哈希值。

    仅供参考,1Password uses a minimum of 25,000 rounds of PBKDF2-HMAC-SHA512. Your users likely won't be using diceware,因此如果可能,您需要更高的计数。

  • 缺点:您将自己锁定在特定算法和轮数中。

    哈希输出实际上将成为用户的密码。您以后将无法调整内容。这意味着随着计算能力的增加,散列会随着时间的推移而变弱。

    此外,由于哈希授予访问您网站的权限,因此它应该存储在钥匙串中。

    使用盐(例如 appname + username)应该可以防止 server breach 影响任何其他站点。

    正如 link 提到的,您可能仍想在服务器上使用 "fast" 哈希(例如 SHA-512)。如果只有数据库受到威胁,这会限制损害。

    在服务器上,哈希值应该在恒定时间内与 hash_equals 进行比较。 password_compat 对于 PHP 的早期版本有 code

    defuse 建议在使用客户端散列时在服务器端使用随机盐。

另一种更常见的方案是在服务器上进行所有哈希处理。

对于 PHP,请参阅 password_hashpassword_verifypassword_needs_rehash

如果您使用的是 PHP 的旧版本,则有 password_compat