mysql - PHPMyAdmin 数据库之间的密码加密

标签 mysql database phpmyadmin passwords password-encryption

我目前正在开发一个网站,客户端使用“密码”功能将密码存储在 MySQL 数据库中。

新数据库将使用 MD5 和 Salt 的组合来存储加密密码。

因此,我使用加密密码将现有用户复制到我们的数据库中,但是当运行密码函数来检查登录时,它总是返回不正确的密码。当我检查密码函数对正确密码的结果时,它会产生与存储的结果不同的结果。

我需要做一些额外的工作才能使加密匹配并产生相同的结果吗?我必须直接从客户网站访问密码吗? (因为我已将用户表复制到我们的本地数据库)

最佳答案

为了从加密中获得相同的结果,您必须在比较哈希值之前使用相同的机制进行加密。

如果您使用密码函数创建了原始密码哈希值,则哈希值将如下所示(对于当前版本的 PASSWORD 函数

    *196BDEDE2AE4F84CA44C47D54D78478C7E2BD7B7

如果使用 OLD_PASSWORD 函数创建,则像这样(在 mysql 4.1 之前...)

    29bad1457ee5e49e

处理这个问题的直接方法是让您的身份验证查询看起来像这样

    select count(*) as authfield from your_auth_table 
    where username = 'typed-in-username'
    and
    (
         password = password('typed-in-password')
         or password = old_password('typed-in-password')
    )

如果用户名和密码匹配,将产生 authfield = 1

如果你想在 PHP 中自己进行加密,对应的 mysql PASSWORD 算法如下:

  $passwordnew = '*'. strtoupper(sha1(hextostr(sha1('pass'))));


  function hextostr($hex)
  {
      $str='';
      for ($i=0; $i < strlen($hex)-1; $i+=2)
      {
            $str .= chr(hexdec($hex[$i].$hex[$i+1]));
      }
      return $str;
  }  

对于 old_password 函数,您可以使用

 $passwordold = old_password('pass');

 function old_password($password) {
   if ($password == '')
      return '';
   $nr = 1345345333;
   $add = 7;
   $nr2 = 0x12345671;
   foreach(str_split($password) as $c) {
      if ($c == ' ' or $c == "\t")
         continue;
      $tmp = ord($c);
      $nr ^= ((($nr & 63) + $add) * $tmp) + ($nr << 8);
      $nr2 += ($nr2 << 8) ^ $nr;
      $add += $tmp;
   }

   if ($nr2 > PHP_INT_MAX)
      $nr2 += PHP_INT_MAX + 1;

   return sprintf("%x%x", $nr, $nr2);
 }

关于mysql - PHPMyAdmin 数据库之间的密码加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23522461/

相关文章:

javascript - 如何在对话中显示两个不同模式之间的关系

php - 单个查询中的多个数据库是可能的吗?

upload - phpMyAdmin:无法导入巨大的数据库文件,有什么建议吗?

mysql - MYSQL 中的查询,其中列作为表名,另一列作为列作为表名的外键

mysql - Mac OS X mySQL 自定义数据库路径 (MAMP PRO)

mysql - 如何将信息从xslt传递到mysql

java - 使用 Liquibase 创建数据库升级差异

mysql - 如何将 csv-import 西里尔文本导入 PhpMyAdmin 中的 latin1-swedish-ci 编码表中?

mysql - mysql 查询可以扩展为另一个查询的子查询吗?

mysql - 如何获取分配在另一列下的列