检查string是否是散列


Check if string is a hash

我使用SHA-512来散列我的密码(当然是加盐的)。我不认为我想要的是可能的,但无论如何让我们问一下。

是否有一种方法来检查字符串是否已经是SHA-512(或其他算法)哈希?

当用户登录时,我想检查他的密码。如果仍然是纯文本形式,则应该将其转换为安全形式。

你的任务非常简单,不需要字符串检查。

先将输入的密码与存储的密码进行比较。
如果匹配-在这里,一个普通的密码。因此,您可以开始转换过程。

正如@zerkms已经提到的,字符串长度是您可以测试的最明显的对象。此外,散列通常用十六进制表示,因此它只由数字0到9和字符a到f组成。或者作为正则表达式

/[0-9a-f]{64}/i

我对这个问题有点困惑。

当用户在您的网站上输入他或她的密码时,您可以假设$_POST['password']中的值(或您命名的任何值)是纯文本。即使用户使用散列函数的结果作为密码,这也无关紧要,因为就应用程序而言,它仍然是纯文本。也就是说,散列值就是用户的密码,无论用户创建密码时采取了什么步骤,因为将该值输入到系统中会导致对该用户的访问。在服务器上对用户提交的密码进行散列处理的意义在于,即使也不知道用户的密码。这样,即使您的数据库被泄露,用户的密码也不会泄露。

获得密码后,从数据库检索该用户的盐和散列密码。将提交的表单用用户特定的盐进行散列,然后将其与数据库中预散列的密码进行比较。如果散列提交和预散列数据库值匹配,则可以假定输入了正确的密码。

我能看到做你描述的事情的唯一原因是,如果你以前以明文形式存储密码,现在正在将它们全部转换为哈希值。在这种情况下,您应该简单地为每个用户分配一个唯一的salt,散列他们当前的明文密码+ salt,并将其存储为他们的新密码。这种转换应该在启用"hashwords"时一次性完成,而不是在用户在转换后第一次登录时零碎地完成。

显然,猜测的唯一方法是检查字符串长度。我打赌没人有这么长的密码。

为什么要在登录时检查散列密码。没有用户使用散列字符串作为密码。

你必须像这样检查

if (sha1($input_password) === 'your hased password') {
    //go ahead
}

你可以在他/她提交表单时散列用户密码,当然这需要javascript。

function myOnSubmit(aForm) {
    //Getting the password input object
    var inputPassword = aForm['password'];
    //Hashing the password before submitting
    inputPassword.value = sha512_hash(inputPassword.value);
    //Submitting
    return true;
}

你的表单将像这样:

<form onsubmit="return myOnSubmit(this);">
<input type="text" name="login"><br>
<input type="password" name="password"><br>
<input type="submit" name="send">
</form>

据我所知,JS没有sha512原生函数,所以你需要sha512函数,你可以检查这个