【问题标题】:Dealing with passwords securely安全地处理密码
【发布时间】:2010-03-19 01:47:10
【问题描述】:

我有一个 Java Web 服务和一个使用该服务的 Java Web 客户端。其中一个功能是创建一个新的用户帐户。我的两个担忧是:

  1. 如何从客户端安全地发送用户密码。
  2. 如何将用户密码安全地存储在服务器上。

我怎样才能实现这些?我基本上知道安全性、安全性算法等背后的理论,但是谁能给我一些关于我应该如何进行编码的建议?谁能指出一些好的(如果可能的话不复杂)的例子,因为我在互联网上发现一些例子非常扭曲?

非常感谢和问候, Krt_马耳他

【问题讨论】:

    标签: security passwords


    【解决方案1】:

    通常,如果您担心密码会以明文形式从 Web 客户端传输到服务,您会通过 SSL 运行服务。

    在后端,我从不以明文形式存储密码,而是在存储之前对其进行哈希处理。确保使用盐。当用户稍后登录时,我对他们提交的密码进行哈希处理,然后将哈希值与之前存储的哈希值进行比较。如果它们匹配,则用户已通过身份验证。就我而言,它的功能远不止于此(具有记住我功能等),但它是它的核心。

    我使用Apache Shiro 框架来帮助解决大部分问题。它相当轻巧,不需要网络环境,但也可以使用。它还与 Spring 和其他解决方案集成,但同样,这不是必需的。可能值得一试。

    【讨论】:

    • @Gumbo:是的,没错,这就是我想说的。哈希它。我会更新我的答案。
    • 感谢您的快速回答 :) 我在 Tomcat 6.0 上运行 Web 服务。如果我添加 SSL(在这里找到一篇好文章:mircwiki.rsna.org/…),密码会安全传输吗?我应该从客户那里改变什么吗?
    • @Tauren 我希望你在密码哈希中使用盐,否则你很容易受到彩虹表攻击。
    • @crazyscot:确实,我确实使用盐。感谢您指出这一点。
    • @Krt_Malta:如果您的 Tomcat 服务正在运行 SSL,那么您将需要使用以 https: 开头的 URL 来安全地传输数据。如果您的应用程序同时在 http 端口 80)和 https(端口 443)上运行,并且您不使用 https,那么它仍然是不安全的。在典型的网络应用中,您只允许您的登录页面/代码在安全环境中运行。
    【解决方案2】:

    John 的规则:始终尽量避免编写自己的安全软件。很容易犯错误,比如加密而不是散列、不使用盐等。你不会找到很多安全专家来审查你的代码,但你可以期待,很多人都看过更流行的开源系统。

    首先,您能否使用OpenIDShibboleth 来避免向人们提供另一个需要密码的系统——如果我可以使用现有帐户,我将非常感谢!

    如果答案是否定的,那么对于密码存储,请尝试免费的 LDAP 服务器,例如 OpenDSApache Directory Server

    使用Spring Security 或类似名称来管理登录和记住我。 (有一个 nice video 介绍了 spring 安全性。)

    如果您希望系统将密码从客户端传送到服务器,则需要使用其他答案中提到的 SSL (https)。

    【讨论】:

      猜你喜欢
      • 2020-01-03
      • 2015-11-21
      • 2011-09-13
      • 2015-05-13
      • 2018-07-18
      • 2014-03-11
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多