如何使这个 salt 和 hash 计划更安全?

How can this salt and hash plan be made more secure?

您好,我正在为一个移动应用程序规划我的服务器登录安全,并记下了一个简单的计划。它看起来安全吗,是否可以通过任何方式进行改进?提前致谢。

客户端首次登录

  1. 从客户端获取设备ID并发送到服务器。
  2. 使用新用户 ID 在服务器和用户帐户上创建 MD5 盐。
  3. 将盐与设备 ID 和用户 ID 连接起来以创建加盐密码。
  4. 创建加盐密码的 MD5 哈希并将哈希密码存储在数据库中。
  5. Return 客户端的用户 ID 和 Salt。

客户重新登录或发出一般请求

  1. 使用客户端使用从服务器接收的盐生成的 MD5 哈希向服务器发送请求,并与设备 ID 和用户 ID 连接。同时以纯文本形式发送设备 ID 和用户 ID。
  2. 验证存储在数据库中的用户设备ID和用户ID与客户端发送的相同。
  3. 验证用户发送的 MD5 哈希值与存储在该用户设备的数据库中的哈希值相同。
  4. 验证并继续处理请求。

如果担心安全问题,我不建议使用设备 ID 作为密码,原因如下:

  1. 这不是秘密信息,可能会在许多网络调用中以明文形式发送到许多服务器,这意味着它可以很容易地被第三方获取。
  2. 恶意第三方获取后无法轻易更改。
  3. 如果 phone 易手,id 将保持不变,允许新的 phone 所有者作为以前的用户登录。

另一种方法显然是让用户选择他们自己的密码,但我猜您已经考虑过这一点,并且您选择使用设备 ID,因为它使您的体验尽可能顺畅用户。

因此,我建议在用户安装应用程序时生成一个 uuid,并将其存储在设备安全存储(密钥库/密钥链)中。在第一个请求中将其与用户 ID 一起发送到服务器。应该生成一个临时会话 ID 并将其返回给客户端,然后可以使用它来验证连续的请求。

此外,MD5 不应用于密码散列,因为它不能抵抗暴力攻击。更好的算法选择是 bcrypt 或 pbkdf2。