Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-发送用于哈希的密码_Php_Send_Salt - Fatal编程技术网

PHP-发送用于哈希的密码

PHP-发送用于哈希的密码,php,send,salt,Php,Send,Salt,我的数据库为每个用户存储唯一的盐 我正在用php为一个应用程序创建一个登录脚本,其中每个用户都有自己独特的salt,下面是我计划如何实现登录 用户输入详细信息并发送它们 发送用户名并检查脚本是否存在 如果返回,则返回该用户的salt,否则返回一般错误 我需要脚本为该用户返回salt,否则,当我的应用程序无法对没有salt的密码进行哈希运算并将其发送回时,它将如何验证提交的密码是否正确? 现在我不确定的是。salt是否加密有关系吗?因为黑客可以看到它是什么,看到密码散列,也许可以用它做点什么。我应

我的数据库为每个用户存储唯一的盐

我正在用php为一个应用程序创建一个登录脚本,其中每个用户都有自己独特的salt,下面是我计划如何实现登录

  • 用户输入详细信息并发送它们
  • 发送用户名并检查脚本是否存在
  • 如果返回,则返回该用户的salt,否则返回一般错误
  • 我需要脚本为该用户返回salt,否则,当我的应用程序无法对没有salt的密码进行哈希运算并将其发送回时,它将如何验证提交的密码是否正确?

    现在我不确定的是。salt是否加密有关系吗?因为黑客可以看到它是什么,看到密码散列,也许可以用它做点什么。我应该在发送盐之前加密它吗

    也许我没有理解/忽略以下回复中的某些内容


    请提供建议。

    如果你的密码是散列的或是作为普通字符串留下的,这并不重要,重要的一点是,对密码进行散列可以防止直接使用字典/彩虹表攻击来暴力破解密码。另一个优点是每个用户都有一个不同的哈希密码

    SALT是在服务器端创建的随机生成的字符串,不涉及到浏览器之间的任何类型的传输

    在您的服务器上:

      // Password from form
      $pw = $_GET['password'];
    
      // Generate salt using unique values
      $salt = (rand(8).$registration_date.$username);
    
      // Password to be hashed
      $pwthb = ($pw.$salt);
    
    如果一个黑客获得了对你数据库的访问权,那么在大多数情况下,你的游戏就结束了,因为你需要存储最初的随机salt来对其进行散列以供比较

    一个简单的例子:

  • 用户在注册时在浏览器中输入初始密码
  • 在您的服务器上,密码与唯一的salt组合,散列并作为密码存储在DB中
  • 盐储存在DB中
  • 注意:可以使用PHP或MySQL/DB函数进行散列

    当用户返回时:

  • 用户在浏览器中输入密码
  • 从DB中抓取盐,并与输入的密码合并
  • 哈希密码+salt并与存储/哈希密码进行比较
  • 如果匹配:验证
  • 就进一步阅读而言,以下内容可能值得一看:



    使用salt+随机密钥将使黑客更难破解加密,因为他们必须手动坐下来为用户算出salt,然后算出密钥;最后开始解密itOr,您可以实现PHPASS并以正确的方式执行它@DarylGill这不是我真正想问的,我是说我应该加密盐吗?或者这就是你加密它的意思你为什么要传送盐?Nubcake,我在问你为什么要通过某种不安全的通讯传送盐。认证应该总是发生在存储salt的地方。需要注意的是,它不是“加密的”,而是“散列的”。加密意味着它可以被解密,而散列是“单向的”,不能分解回原始部分。在处理用户密码时有一个很小但很重要的区别^^另一个小问题是,如果正确地对其进行散列,则如果获得了对DB的访问权,则游戏将无法进行(使用
    bcrypt
    或大幅拉伸散列,以便创建存储的散列,计算时间至少为1-2秒)。“产生进入数据库的散列密码所需的时间越长,即使已知密码中的盐,也要用更长的时间来尝试并强制使用实际密码。”jon Point注意到,只是尽量保持简单。