【问题标题】:java - Is this technique for handling client/server hashed password OK?java - 这种处理客户端/服务器散列密码的技术好吗?
【发布时间】:2011-09-15 07:22:22
【问题描述】:

大量阅读有关如何正确处理 HASH SALT+密码的信息
我想出了这个。您如何看待这种情况:

当新用户首次注册时。

  • 客户端在本地输入名称/密码,并使用公钥 RSA 加密发送到服务器。
  • 服务器验证用户/通行证,如果决定获得批准,则发回 HASH SALT+通行证版本。
  • 私有 SALT 存储在服务器上。

现在,当用户连续登录时,他使用上述客户端存储的 SALTE 密码,如果黑客想要该密码,他需要破解服务器以获得 SALT,对吗?所有使用此 HASH SALT+密码的连续日志记录也是公钥 RSA 加密的。

我不是加密专家,但我知道可以使用两种方式公钥/私钥加密和其他更高级的方式。这有点在我头上,所以这就是我问这个的原因

这个逻辑有什么错/对?

【问题讨论】:

    标签: java validation encryption


    【解决方案1】:

    没有必要将盐保密,因为它将使用用户名和密码进行散列,以创建唯一的(基于会话的)散列。鉴于它是一个散列,它不能被反转(即你不能从散列中派生用户名、密码或盐)。所需要做的就是生成会话盐并将其与服务器上的任何其他会话变量一起保存。然后,服务器将使用用户名、密码和盐重现哈希,并将其与客户端发送的值进行比较。

    这样您就根本不需要加密(尽管建议这样做)。如果您没有安全网站(即使用 https),那么您仍然可以使用这种技术来保护密码。

    这种技术称为HMAC

    【讨论】:

    • “这样你根本不需要加密。” - 错了。无论用户向服务器发送密码还是散列密码,都必须加密。
    • @maartinus:加密是严格可选的。客户端不会向服务器发送密码或散列密码;它发送一个散列的用户名+密码+盐。
    • 什么可以阻止攻击者通过网络窃听发送相同的哈希?如果您对密码+消息进行哈希处理,则可以安全地抵御重播以外的攻击,但我看不出哈希用户名以及密码和盐有什么帮助。
    • @gustafc:服务器每次登录尝试(即每个会话)都会生成 salt,因此它是唯一的。服务器使用与它的会话变量一起保存的盐以及从数据库中检索到的明文用户名和密码来重新创建散列字符串并将其与客户端提供的字符串进行比较。
    • 您可以简单地调整 HMAC 以满足您的需求;如果您想锁定哪些客户端可以连接到服务器,那么您需要在客户端处理私钥;如果你不这样做,你可以忽略它。
    【解决方案2】:

    这个呢

    当所有客户端第一次登录时,
    首先通过创建应用于密码的随机大 SALT 在本地隐藏飞机站点密码。
    (现在可见密码在本地消失了)

    然后他们使用公钥 RSA 加密登录到服务器并
    创建一个新的用户帐户,服务器保存上面本地创建的哈希密码。

    下次同一用户登录时使用 Public
    密钥 RSA 加密服务器将正确比较哈希

    要让黑客登录,他需要使用公钥 RSA 加密的哈希密码

    有什么意见吗?

    更新: 一个问题。
    - 如果 SALT 是随机的,现在可以比较密码,假设用户卸载然后重新安装程序并想使用他的旧帐户再次登录。
    他的旧帐户 SALT+Password 将不一样。所以我们需要给 USER 发送一个 SALT 或者以一种非常聪明的方式在本地创建盐,这样黑客就看不到这一点。

    时间:

    【讨论】:

      猜你喜欢
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多