【问题标题】:How can this salt and hash plan be made more secure?如何使这个盐和哈希计划更安全?
【发布时间】:2019-09-03 00:57:53
【问题描述】:

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

客户端首次登录

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

客户再次登录或提出一般请求

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

【问题讨论】:

  • 我建议只使用经过验证的库来提供此功能。你会重新发明轮子,认为你让事情变得安全,但我怀疑我们中的大多数人会比这些图书馆的一群贡献者更聪明:)
  • @jcuypers 我很欣赏你的观点。我正在使用 PHP 和 Unity,我必须自己在客户端做大部分的腿部工作。我也想学我能学的。您对此类库有什么建议吗?
  • 我更喜欢 Angular。无论如何,我可以为您提供这个很好的链接来很好地解释这个主题:crackstation.net/hashing-security.htm。它列出了一些 PHP 库,但我无法评论它们。
  • @jcuypers 这是一个非常好的链接。谢谢,我很难在 G 搜索中遇到这种情况。看来我离建议不远了。我存储的数据对安全不敏感,因此我目前对使用本文中的建议感到满意。我只想停止在游戏中作弊。主要收获是不要使用 MD5 进行散列,也不要在每个请求中发送散列,而是使用存储在数据库中的盐重建服务器上的散列并发送密码,在我的情况下将是设备 ID站立。我可以看到用户密码的一个很好的理由。谢谢

标签: security hash salt


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 好建议,你加强了我昨天比赛结束时的研究和思考过程。我还计划在注册游戏服务器之前使用其他社交网络让用户登录。 Facebook 允许我通过服务器到服务器调用来验证用户令牌,这还增加了密码安全层。我喜欢 GUIID 的想法。
  • 您是否建议为每个新会话创建一个新会话 ID,例如重新打开应用程序?我也在用 AES 加密数据,我在想会话 ID 可以成为启动请求的一部分,该请求建立一个唯一的哈希来加密与新用户 ID/帐户关联的更敏感数据,以便在用户拥有会话 ID 后发送,好主意?
猜你喜欢
  • 2013-04-26
  • 2019-03-13
  • 2010-09-28
相关资源
最近更新 更多