【问题标题】:Best practise with handling password via Web service通过 Web 服务处理密码的最佳实践
【发布时间】:2010-09-16 08:36:27
【问题描述】:

我有 N 层应用程序,由三部分组成:

1. Client (WPF)
2. WebService (Java web service) (Business logic)
3. Database (Oracle)

我将密码存储在 oracle 数据库中的 md5 中,但将密码从客户端发送到未加密状态的 Web 服务,就像一个简单的字符串一样。我必须使用哪种技术来保护网络中的密码?

【问题讨论】:

  • ssl 可能吗?依赖网络加密?
  • 只要传递给服务的密码是 MD5 散列并且散列已经用一些值加盐,我认为它足够安全地传递(任何拦截该值的人也不知道它的 MD5不知道盐)。当然,有了 SSL 会更好。
  • @In Sane,你的意思是什么盐?如果它是固定盐,那么我听起来很容易拦截盐渍哈希并编写一个替代客户端来使用该盐渍哈希。

标签: c# java passwords


【解决方案1】:

我真的建议您使用 SSL,除非您要考虑很多安全问题。 Kerberos 也很好地解决了这些问题,但使用起来并不那么简单。

通过阅读Designing an Authentication System: a Dialogue in Four Scenes,我对安全身份验证问题有了一些见解(它是关于设计 Kerberos,但很多内容通常适用于所有身份验证系统)。

【讨论】:

    【解决方案2】:

    我认为 SSL 是其他人建议的您的朋友。但无论你做什么,我都不会通过网络发送 MD5 散列。散列(使用 MD5 或其他)的部分目的是避免存储可以“照此使用”来验证用户的值。如果任何攻击者能够访问数据库,他只会看到散列密码,但仍需要使用原始密码(他无法从散列中解密)来访问 Web 服务。如果您的 Web 服务决定让客户端进行哈希处理,而不是要求原始密码并在将其与数据库中存储的值进行比较之前对其本身进行哈希处理,则上述攻击者只需发送受损哈希值即可进行身份验证。

    【讨论】:

      【解决方案3】:

      如果您担心请求被拦截,那么您可以使用 SSL 在客户端和 WS 之间进行通信。即使您在将真实密码发送到 Web 服务之前在客户端内部对其进行编码,如果编码形式以某种方式被公开,它也可以“按原样”用于制定来自任何 HTTP 客户端对 Web 服务的请求。或者,您可以使用仅存储在客户端中的算法对消息内容本身进行加密,这样您就可以确保所有 WS 请求仅来自您的客户端。

      【讨论】:

        【解决方案4】:

        您可以将密码 MD5 从客户端发送到 Web 服务。更好的是,盐渍 MD5(在 DB 中,您还应该保留盐渍 MD5)。然后只需比较从客户端收到的内容与 DB 中的内容。

        【讨论】:

        • 这如何安全?是什么阻止我拦截该 MD5(或加盐 MD5 哈希)并将其从我的恶意应用程序作为密码发送?
        • MD5 不是密码。但你是对的,也应该有另一种保护(如 SSL)。
        猜你喜欢
        • 2012-11-26
        • 1970-01-01
        • 1970-01-01
        • 2015-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-07
        相关资源
        最近更新 更多