使用 Swift 的 .hash 作为密码 storing/checking

Using Swift's .hash for password storing/checking

编辑

我一直在对此主题进行更多研究,下面的答案非常有帮助!但我也只是想将此添加到可能遇到此页面的任何人,他们像我一样仍在努力了解如何将身份验证安装到您的应用程序中。 (当然,OAuth 和 Local authentication 是很好的途径,但如果由于某些原因你不能这样做,请看一下 link:)

https://security.stackexchange.com/questions/8596/https-security-should-password-be-hashed-server-side-or-client-side


我原来的问题在下面

我对 iOS 开发的应用程序安全部分非常陌生。我有一个应该用密码锁定的应用程序,我想看看保护它的最佳方法。所以这就是我的想法:

  1. 用户创建(或提供)密码

     let password = "password"
    
  2. 我使用该密码的 .hash 将其存储在服务器中

  3. 当用户需要重新登录时,他们会输入密码,应用程序会从服务器上提取哈希值,并根据他们刚刚输入的内容的 .hash 进行检查在

     let passwordString = textbook.text
    
     if passwordString.hash == hashPulledFromServer {
         //log in
     } else {
         //failed
     }
    

这是最好的方法吗?我读过 hashValue 并不总是产生相同的值,这当然不会使这种感觉成为可能。但这是将数据传输到服务器并在以后使用它来检查密码的安全方法吗?

很难详细回答你的问题。信息安全是一个庞大的课题。

您应该尽可能依赖现有的解决方案和实施。例如。您可以使用 OAuth 或 OpenID 让您的应用永远不需要处理密码吗?如果您只想保护对应用程序的本地访问,是否可以使用本地身份验证框架?

您的问题“您可以使用 .hash 吗?”的简短回答是

.hash 用于为对象创建散列,可用于帮助在字典和集合等集合中查找。

计算简单,可以快速计算。它不会竭尽全力防止散列冲突(两个不同的对象散列为相同的值)。它具有这些特征,因为预计该函数将被大量使用(例如,每次访问字典)并且冲突并不重要;内存中的集合非常小,可以轻松处理冲突。

这与您想要的加密密码哈希相反,例如 scrypt:

  • 您希望散列函数相对较慢且计算量大,以减缓暴力攻击;密码不是经常 hashed/checked 所以这在正常情况下并不重要
  • 你不想要碰撞;冲突将导致不正确的密码被接受为正确的