0

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

4

6 回答 6

2

散列是一种单向函数,它产生一个恒定长度的字符串。(至少,常见的,包括sha-512。我不知道hash的定义是否保证了恒定长度。)

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

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

例如,“a”的 SHA-512:

1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75

和 aldfksjhalkdfjh:

cde67871372c0a5e90ea3ae4b14ca3daa5ccd63f16b1f74181e2ab2d7bad2774a439f84d64d6c58eb77c17b03957ba98b897a14048b93cf18451500fd6f1ac41

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

有很多优秀的资源可用于良好的密码存储实践。如果您打算拥有一个带有用户密码的网站,您应该看看这些。

于 2013-08-27T19:52:59.850 回答
0

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

应该如何存储和检查:

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

于 2013-08-27T19:50:05.117 回答
0

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

于 2013-08-27T19:50:41.470 回答
0

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

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

于 2013-08-27T20:03:22.100 回答
0

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

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

祝你好运

于 2013-08-27T20:41:47.393 回答
-2

计数($字符串)

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

于 2013-08-27T19:49:40.247 回答