安全地处理密码

问题描述:

我有一个Java Web服务和一个使用此服务的Java Web客户端。其中一项功能是创建一个新的用户帐户。我的两个问题是:安全地处理密码

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

我怎样才能做到这些?我知道基本理论背后的安全,安全算法等,但任何人都可以给我一些建议,我应该如何去编码?任何人都可以指点我一些很好的(如果可能的话,不复杂)的例子,因为我发现互联网上的一些例子很扭曲?

非常感谢和问候, Krt_Malta

通常,如果您担心密码从Web客户端与服务的清晰传输,您将通过SSL运行服务。

在后端,我永远不会将密码存储在明文中,在存储之前对其进行散列处理。确保使用盐。当用户稍后登录时,我散列它们提交的密码,然后将散列值与之前存储的散列值进行比较。如果它们匹配,那么用户已经认证。在我的情况下,除此之外还有更多的东西(记住我的特色等),但它是它的胆量。

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

+0

不加密它,散列它。 – Gumbo 2010-03-17 20:47:50

+1

@Gumbo:是的,确切地说,这就是我的意思。哈希。我会更新我的答案。 – Tauren 2010-03-17 20:49:14

+0

感谢您的快速回答:)我在Tomcat 6.0上运行Web服务。如果我添加SSL(在这里找到一篇好文章:http://mircwiki.rsna.org/index.php?title=Configuring_Tomcat_to_Support_SSL),密码会被安全传输吗?我应该改变客户端的任何东西吗? – 2010-03-17 21:12:15

约翰的规则:总是尽量避免编写自己的安全软件。很容易出错,比如加密而不是哈希,不使用盐等等。你不会找到许多安全专家来检查你的代码,但你可以期望有不少人看到了更受欢迎的开源系统。

首先,你可以使用OpenIDShibboleth避免给别人另一个系统,他们需要密码 - 我会感谢你,如果我可以使用现有的帐户!

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

使用Spring Security或类似来管理登录和记住我。 (有一个nice video,介绍弹簧安全。)

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