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_hash
、password_verify
和 password_needs_rehash
。
如果您使用的是 PHP 的旧版本,则有 password_compat。
我需要在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_hash
、password_verify
和 password_needs_rehash
。
如果您使用的是 PHP 的旧版本,则有 password_compat。