2011-10-23 179 views
0

我甚至不知道在这里问什么问题。我的问题陈述很简单:我需要使用salt在数据库上存储密码,根据存储的密码验证输入的密码,并在用户尝试登录时使用随机挑战字验证密码。我使用的是php/javascript。如何验证和验证密码?

在试图解决这个问题时,我遇到的问题是,如果我在html表单中传递一个质询词,然后将输入的密码与该词进行哈希,我可以在服务器上验证密码,但是我不能将密码与质询词分开,以便我可以根据DB上的腌制密码对其进行验证。如果我以明文方式将密码发送到服务器,或者在没有提示字的情况下发送密码,我可以验证它,但现在我无法可靠地对其进行身份验证。

我想我需要某种形式的2路算法,这样我就可以一键加密,然后在验证密码进行验证的关键。我该怎么做?或者如果它不能完成那么我该怎么做?

+0

要清楚,随机挑战是为了在运输过程中保护密码?或者是一种认证机制来证明他们是人类或类似的? –

+0

为了解决这个问题,我查看了一个名为“Geeklog - 安全CMS”的PHP博客的源代码。瞧,他们发送他们的用户密码是免费和清晰的,他们使用服务器上的MD5来“编码”密码。所以也许我的问题应该是“我应该使用盐和质询词来实现密码验证和认证的类型的系统?” – James

+0

也phpBB似乎发送密码自由和明确。我想我一直在想这个问题。 – James

回答

0
  1. 要存储密码,请生成随机盐。店铺HASH(password+salt)salt。 (服务器或客户端可以执行此计算。)

  2. 要执行身份验证,服务器将查找saltHASH(password+salt)。然后它会产生一个随机挑战,并将盐和挑战发送给客户。

  3. 在客户端上,提示用户输入密码。计算:
    HASH(HASH(password+salt) + challenge)。将它发送到服务器。

  4. 在服务器上,您已经有HASH(password+salt),并且您有challenge。所以你也可以计算:
    HASH(HASH(password+salt) + challenge)。将此与客户发送给您的内容进行比较。如果它们匹配,则密码是正确的。

请注意,这易受MITM攻击影响,所以应该通过本身受保护的连接(例如SSL连接)使用它。

+0

这听起来像我想要一个2步登录过程:1)用户提交用户名,服务器查找用户并发送盐和挑战2)用户输入密码并提交。 – James

+0

在将客户端发送到服务器之前,密码在客户端上散列没有任何优势。这只是不必要地使客户端代码复杂化。 – NotMe

+0

好处是服务器不能放弃密码。例如,服务器经常结束日志记录密码,并且这些日志文件有时会受到损害。如果服务器没有看到密码,则无法记录或妥协。 (是否值得付出努力是另一个问题。) –

2

加密与客户端脚本密码通常是一个坏主意。正确的方法是使用SSL。

此外,从未存储密码以明文的形式。如果您必须使用像你上面描述的一个方法,哈希密码两次:一次将其存储在数据库中,另一次为双向认证。