【问题标题】:Check if string is a hash检查字符串是否为哈希
【发布时间】:2011-04-13 20:53:57
【问题描述】:

我正在使用 SHA-512 对我的密码进行哈希处理(当然是加盐)。我不认为我想要的东西是可能的,但我们还是问问吧。

有没有办法检查字符串是否已经是 SHA-512(或其他算法)哈希?

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

【问题讨论】:

  • 什么意思?这是他将数据输入登录表单的时候吗?我想可以进行长度检查。
  • 唯一不可靠的特征是字符串的长度。不过好像不太靠谱。 SHA-512 字符串有多长?
  • 请记住这可能造成的安全问题。如果您接受来自用户的 SHA-512 哈希而不是密码,那么您实际上是在转换为“纯文本密码存储”,这违背了哈希的全部目的。
  • 你意识到这个问题并不重要。当一个人输入他们的密码时 - 它不是一个哈希值。不要费心检查。无论如何,您都必须对其进行哈希处理以进行存储。所以所有新输入的密码都是明文的,所有存储的密码都经过哈希处理。简单!

标签: php security passwords sha


【解决方案1】:

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

只需将输入的密码与存储的密码进行比较即可。
如果匹配 - 这是一个普通密码。所以,你可以开始转换过程了。

【讨论】:

  • 据我所知,这使得暴力攻击比他们应该的更简单。它允许在比较之前绕过密码的散列和加盐。
  • @KingCrunch 怎么更简单?
  • @KingCrunch:它允许,那又怎样?
  • @Demento:天哪,伙计,我知道实际上是什么哈希。如果我们按照@Col 建议的方式进行蛮力攻击,将不会更容易,不是吗?为什么?只是因为他们不会。
【解决方案2】:

正如@zerkms 已经提到的,字符串长度是您可以测试的最明显的东西。此外,哈希通常以十六进制编写,因此它仅由数字 0 到 9 和字符 a 到 f 组成。或者作为正则表达式

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

【讨论】:

    【解决方案3】:

    我对这个问题有点困惑。

    当用户在您的网站上输入他或她的密码时,您可以假设$_POST['password'](或您命名的任何名称)中的值是纯文本形式。即使用户使用哈希函数的结果作为他们的密码,也没关系,因为就您的应用程序而言,它仍然是纯文本。也就是说,散列值 用户密码,无论他们采取什么步骤来创建它,因为 该值 进入系统会导致该用户访问.在服务器上散列用户提交的密码的目的是,即使 也不知道该用户的密码。这样,如果您的数据库遭到破坏,则不会泄露用户密码。

    一旦您获得密码,您就可以从数据库中检索该用户的盐和哈希密码。您获取提交的表单,使用特定于用户的盐对其进行哈希处理,然后将其与数据库中的预哈希密码进行比较。如果散列提交和预散列的数据库值匹配,那么您可以假设输入了正确的密码。

    我能看到按照您描述的方式进行操作的唯一原因是,您之前是否以纯文本形式存储了密码,现在正在将它们全部转换为哈希值。在这种情况下,您应该简单地为每个用户分配一个唯一的盐,散列他们当前的纯文本密码 + 盐,并将其存储为他们的新密码。这种转换应该在启用“hashwords”时一次性发生,而不是在用户在转换后第一次登录时零碎进行。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 对于这个特殊的任务有更明显的解决方案:)
      【解决方案5】:

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

      你必须像这样检查

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

      【讨论】:

        【解决方案6】:

        您可以在他/她提交表单时对用户密码进行哈希处理,这当然需要 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函数,可以查看this

        【讨论】:

        • 你不应该那样做。至少没有从服务器添加随机数
        • 为什么,你会更具体吗?
        猜你喜欢
        • 1970-01-01
        • 2019-08-08
        • 2020-07-19
        • 2013-07-06
        • 2016-02-22
        • 1970-01-01
        • 2013-05-28
        • 2012-05-16
        • 1970-01-01
        相关资源
        最近更新 更多