如何检测哈希密码长度


How to detect hashed password length?

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

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

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

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

例如,"a"的SHA-512:

1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75

和aldfksjalkdfjh:

cde67871372c0a5e90ea3ae4b14ca3daa5ccd63f16b1f74181e2ab2d7bad2774a439f84d64d6c58eb77c17b03957ba98b897a14048b93cf18451500fd6f1ac41

长度相同。哈希的全部意义在于它隐藏了原始密码的性质。无论如何,在验证密码合法之前,没有理由计算哈希。所以,是的,服务器端验证是可行的!

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

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

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

如何进行存储和检查:

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

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

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

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

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

祝好运

count($string)

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