iOS应用程序-应用程序内或服务器上的哈希用户密码?

信息安全 密码 IOS
2021-08-26 11:07:47

我正在开发一个也将具有 Web 组件的 iOS 应用程序。当用户创建帐户时,他们的密码将被加盐和散列。我已经有在 web 端工作的散列算法。

当新用户在应用程序中创建帐户时,iOS 应用程序是否应该对他们的密码进行哈希处理并将其发送到服务器以直接插入数据库?还是应该将他们的密码以纯文本形式发送到服务器,并在那里进行散列?它应该在应用程序中加密,发送到服务器,解密,然后散列吗?我只是不确定最好和最安全的协议是什么。我想同样的问题也适用于对尝试登录的现有用户进行身份验证。

此外,此时我还没有在服务器上设置 SSL,但如果它对此有帮助,我当然愿意这样做。

4个回答

使用 SSL 安全地处理 Internet 上的通信,然后在服务器上散列密码。否则,就服务而言,密码哈希只是成为密码,并且获得对您数据库的访问权限的攻击者可以以您的任何用户身份登录,就好像他们的密码以明文形式存储一样。SSL 对于防止用户的凭据在网络上被截获至关重要。

为什么不能两者兼而有之?当用户输入他们的密码时(作为新用户或在登录期间),在客户端对其进行哈希处理,然后通过安全通道将其发送到服务器,服务器将在进行任何比较之前再次对其进行哈希处理。冗余的分布式安全性;只要攻击者不在输入明文密码的机器上(使用键盘记录器等),他就必须破坏多个散列/加密层,并且系统中没有一个节点知道需要的一切已知从明文密码获取到存储在数据库中的哈希值。

在服务器上执行的哈希应该是昂贵的,例如 bcrypt 或 scrypt;客户端上的那个应该仍然是一个加密强度的哈希,但是像 SHA-512 这样更快的东西就可以了。

当前可用的最安全的协议涉及公钥密码术。

  • 在服务器上生成“服务器”私钥。私钥永远不会离开服务器。以某种方式获取应用程序的相应公钥。使用 HTTPS (TLS) 是最常见的处理方式。通常,Web 服务器系统管理员支付大约 100 美元来获得由证书颁发机构签名的公钥;但这在技术上不是必需的。
  • 当应用程序首次在该设备上运行时,在应用程序本地生成“设备”私钥。私钥永远不会离开设备。(最佳做法是生成“签名”私钥和“加密”私钥,然后生成从它们派生的公钥)。以某种方式将这些公钥从应用程序获取到服务器,可能是在用户创建帐户时。
  • 使用某种相互身份验证。有人告诉我,TLS 的(可选)“客户端身份验证”部分(“客户端身份验证的 TLS 握手”)是执行此操作的一种方法。

唉,处理一个拥有多个设备(每个都有自己的私钥/公钥对)的用户有点棘手。

听起来您正在寻找密码验证密钥协议(PAKE) 协议。我的理解是,有几个软件库支持“安全远程密码协议”(SRP)或其他一些 PAKE 协议,包括 GnuTLSOpenSSLBouncy Castle其他 TLS 实现