如何检测哈希密码长度?

时间:2013-08-27 19:47:40

标签: php hash passwords

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

6 个答案:

答案 0 :(得分:2)

哈希是一个one-way function,它产生一个长度恒定的字符串。 (至少,常见的,包括sha-512。我不知道哈希的定义是否保证了常量长度。)

如果你考虑哈希的作用,这应该是显而易见的。哈希将任何字符串转换为例如32个字符的字符串。当然,并非所有关于任意长字符串的信息都可以存储在有限的预定长度的字符串中!因此,根据pigeonhole principle,必须存在hash collisions - 两个字符串散列到相同值的情况。你不能把n只鸽子放进n-1鸽笼!

由于我们知道存在无限的哈希冲突(因为存在无限可能的字符串),我们可以证明至少2个(实际上是无限的)不同长度的字符串将散列到相同的值。因此,由于长度可能是来自相同散列的几个(无限)值,因此您显然无法获得原始字符串的正确长度(或使用良好散列的任何真实标识信息)。

例如,“a”的SHA-512:

1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75

和aldfksjhalkdfjh:

cde67871372c0a5e90ea3ae4b14ca3daa5ccd63f16b1f74181e2ab2d7bad2774a439f84d64d6c58eb77c17b03957ba98b897a14048b93cf18451500fd6f1ac41

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

有很多优秀的资源可用于良好的密码存储实践。如果您计划拥有一个包含用户密码的站点,您应该查看这些内容。

答案 1 :(得分:0)

通过解密哈希值无法获取原始密码长度,因为这是对密码的保护 。您可以在最常见的网站上看到自己,当您忘记密码并想要检索密码时,您几乎总是会得到一个随机代码来将密码更改为新密码,因此无法获取已存储在密码中的密码。数据库,因为它是哈希。

应如何存储和检查:

您应该将普通密码转换为哈希,哈希将存储在密码字段中的数据库中,每次用户登录时,普通密码都将转换为哈希并检查它是否与哈希相匹配在数据库中。这样,在检查数据库时密码已经被散列。

答案 2 :(得分:0)

密码经过哈希处理后,您无法获得有关密码的任何信息。这就是这样做的全部观点。在服务器上散列之前检查您的长度(在Javascript中不是客户端)并拒绝并且如果密码未通过验证则不散列密码。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

在表单提交或执行AJAX请求时将其发送到未加密的服务器,然后在运行

之前检查长度
$password = $_POST['password'];
$length = strlen($password); 
hash("sha512", $password);
祝你好运

答案 5 :(得分:-2)

计数($字符串)

根据散列密码类型,长度始终相同。 md5是32我相信(不确定)