我正在使用 SHA-512 对我的密码进行哈希处理(当然要加盐)。我不认为我想要的东西是可能的,但我们还是问问吧。
有没有办法检查字符串是否已经是 SHA-512(或其他算法)哈希?
当用户登录时,我想检查他的密码。如果它仍然是纯文本,它应该被转换为安全的形式。
您的任务非常简单,不需要检查字符串。
只需将输入的密码与存储的密码进行比较即可。
如果匹配 - 这是一个普通密码。因此,您可以开始转换过程。
正如@zerkms 已经提到的,字符串长度是您可以测试的最明显的东西。此外,哈希通常以十六进制编写,因此它仅由数字 0 到 9 和字符 a 到 f 组成。或者作为正则表达式
/[0-9a-f]{64}/i
我对这个问题有点困惑。
当用户在您的网站上输入他或她的密码时,您可以假设$_POST['password']
(或您命名的任何内容)中的值是纯文本的。即使用户使用哈希函数的结果作为他们的密码,也没关系,因为就您的应用程序而言,它仍然是纯文本。也就是说,散列值是用户密码,无论他们采取何种步骤来创建它,因为将该值输入系统会导致该用户可以访问。在服务器上对用户提交的密码进行散列处理的目的是,即使您不知道该用户的密码。这样,如果您的数据库遭到破坏,则不会泄露用户密码。
获得密码后,您可以从数据库中检索该用户的盐和散列密码。您获取提交的表单,使用特定于用户的 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函数,你可以检查这个。