2013-08-27 79 views
0

我已经开始学习密码哈希了。我不知道如何检测哈希密码长度?现在我正在试验sha512,其中一个问题是如何获取用户输入的密码长度?或者是不可能的,我应该在向服务器发送密码之前使用javascript验证用户输入的密码长度(例如,如果它超过8个字符)?有人可以解释我或建议一些学习材料吗?如何检测哈希密码长度?

+0

你的问题很清楚了。你试图得到什么样的长度?为什么? – SLaks

+4

一旦密码被散列,就无法获得任何有关它的原始形式的信息。 –

+0

散列是单向的。从散列开始,找不到有关原始字符串的任何信息。这就是哈希算法的重点。 –

回答

2

散列是一个one-way function,它导致一串恒定的长度。 (至少,包括sha-512在内的常见内容,我不知道散列的定义是否保证了恒定的长度。)

如果你想到散列做什么,这应该是显而易见的。散列可将任何字符串转换为32个字符的字符串。当然,并不是所有关于任意长的字符串的信息都可以存储在一个有限的预定长度的字符串中!因此,根据pigeonhole principle,必须存在hash collisions-其中2个字符串散列为相同值的情况。你不能让n只鸽子进入n-1个鸽子洞!因为我们知道有无限的哈希碰撞(因为有无限的可能的字符串),所以我们可以证明至少有2个不同长度的(真正无限的)字符串会哈希到相同的值。因此,由于长度可能是来自同一散列的几个(无限)值,因此显然无法获得原始字符串的正确长度(或使用良好散列的任何实际标识信息)。

例如, “一” 的SHA-512:

1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75

aldfksjhalkdfjh的和:

cde67871372c0a5e90ea3ae4b14ca3daa5ccd63f16b1f74181e2ab2d7bad2774a439f84d64d6c58eb77c17b03957ba98b897a14048b93cf18451500fd6f1ac41

相同的长度。散列的重点在于它隐藏了原始密码的性质。无论如何,在验证密码合法之前,没有理由计算哈希值。所以,是的,服务器端验证是要走的路!

有很多优秀的资源在那里用于良好的密码存储实践。如果您打算拥有使用用户密码的网站,则应该查看这些网站。

-1

count($ string)

取决于哈希密码类型,长度始终相同。 MD5是32,我相信(不知道)

0

这是不可能通过解密哈希来获得原始密码长度,因为那是你密码的保护。您可以在大多数常见网站上看到自己,当您忘记了密码并想要检索密码时,几乎总是会得到一个随机密码来将密码更改为新密码,不可能只获取已存储在密码中的密码数据库,因为它被散列。

如何存储和检查要做到:

你应该明文口令转换成散列,散列将在寄存器存储在数据库中的密码字段,每次用户登录时,无格式密码将被转换为散列并检查它是否与数据库中的散列匹配。这样在检查数据库时密码已经散列。

+0

让我们来谈谈注册过程。例如,用户填写注册表单并将其发送到服务器。首先,我应该验证他的输入,如果一切正常,将它添加到数据库中? – user2699508

+0

@ user2699508请不要将原始密码添加到数据库! – vroomfondel

+0

@rogaos不,我的意思是,如果它是有效的,当哈希,盐它最终添加到数据库。 – user2699508

0

密码被散列后,您无法获取有关密码的任何信息。这就是完成这一点的关键。检查你的长度,然后在服务器(不是客户端使用Javascript)上散列,并拒绝,如果密码未通过验证,则不要散列密码。

+0

那么,纠正我,如果我错了,是安全的发送用户输入密码作为一个纯字符串?例如。在注册期间,用户键入“密码”并以纯文本形式发送。 – user2699508

+0

用户必须以纯文本格式将*发送给您*。你绝不应该以任何形式将它*发送给他*。 – deceze

+0

@ user2699508 - 是一个密码可以发送到服务器的明文。在发送之前散列密码没有任何优势,因为散列本身将充当密码。要安全地发送密码,您需要加密的SLL连接。 – martinstoeckli

0

理想情况下,您应该通过HTTPS将凭据发送到服务器,然后使用您可以从用户数据派生的盐对密码进行哈希处理。然后,散列密码将存储在您的持久性中,并且每当提供用户凭据时,都会基于salt重新创建散列,然后将散列与持久性中的散列进行比较。

如果问题与密码强度有关,那么您可以使用javascript实际计算密码长度作为客户端验证本身。

0

你当表单提交或AJAX请求执行它发送到服务器加密,那么你检查长度运行

$password = $_POST['password']; 
$length = strlen($password); 
hash("sha512", $password); 

好运