【问题标题】:Can a default user's password be set in SQL using PHP's password_hash?可以使用 PHP 的 password_hash 在 SQL 中设置默认用户的密码吗?
【发布时间】:2020-05-31 21:56:30
【问题描述】:

我的旧 PHP 应用程序有一个默认管理员用户和由创建数据库的 SQL 创建的 md5 加密密码:insert into users values ( 1, 'admin', MD5('changeMe'), 2 );

是否有一种简单的方法可以在创建表时使用 PHP 的 passowrd_hash 函数包含默认用户和加密密码?我问是因为我知道 password_hash 是一个原生 PHP 函数,我认为它不会在 SQL 中被理解。

【问题讨论】:

  • 您可以在 PHP 解释器中使用 echo password_hash('changeMe'); 并在查询中使用结果字符串。
  • 使用password_hash 生成哈希并然后插入它。
  • 警告:编写访问控制层并不容易,而且有很多机会严重错误。任何现代的development framework 像Laravel 都带有一个内置的authentication system,并且您可以使用authentication libraries。至少遵循recommended security best practices 并且永远不要将密码存储为纯文本 或像 SHA1 或 MD5 这样的弱哈希。
  • 将尝试@Nick 和 tadman 的方法。从长远来看,我会尝试编写一个安装程序来插入一个空的用户表。
  • 您在此处描述的内容通常称为“数据库种子”,因为您需要添加到数据库中以从无到有引导。许多框架都有正式的方式来声明这些。在您自己的临时应用程序中,您需要发明并记录您自己的方法。例如,如果您执行 echo password_hash('defaultpassword') 的结果,您可以创建一个 SQL 文件。请记住,通常最好在播种过程中生成一个随机密码并将其回显到屏幕上,以便用户可以使用它。

标签: php mysql encryption


【解决方案1】:

我的问题的解决方案分为三个部分。我的 OP 寻求一种简单的方法来为管理员用户创建一个散列密码,以便在安装应用程序时插入 MySQL 数据库,使用原生 PHP password_hash() 函数。

(1) 根据@Nick 和@Tadman 的建议,我决定在安装程序脚本中设置哈希值,该脚本不仅可以设置哈希值,还可以设置其他已定义的站点/应用程序变量。

而不是在创建数据库表时插入用户值,而是将其推迟到紧接之后,管理员用户以插入哈希并将其他定义写入文件的形式输入其凭据:

$userpass = $_POST['userpass'];
echo password_hash($userpass, PASSWORD_BCRYPT);

(2) 我的问题的第二部分是替换 md5()`` withpassword_hash()` 的所有实例,我通过使用我在网上找到的一个简洁的 PHP script 递归搜索和替换服务器上的出现来实现这一点。

替换了md5() 的出现后,我需要更改哈希比较方法,并再次通过搜索相关文件来替换以下实例:

if ($p != $theUser->pwd ) {
    return( false );     }

与:

if(password_verify($p, $theUser->pwd)) {
    // Success!
    }
else {
    // Invalid credentials
echo "Uh oh!";
    }

(3) 解决问题的第三步是discovering,在 md5 哈希的开头添加 $1$ 可以使它被password_hash(); 读取,所以我只需要在已安装的数据库中进行一些调整到管理员用户的旧密码。

感谢那些帮助照亮我的人,让我找到了自己的路。我现在要去发明轮子和切片面包了。

【讨论】:

    【解决方案2】:

    你可以在 php 中做这样的事情:

    $hash = password_hash('changeMe'); 
    //echo $hash; 
    

    然后在数据库中使用此哈希。

    【讨论】:

    • 因为 MD5 绝对没有任何业务用于存储密码。
    • 将密码提供给一些粗略的网站似乎很麻烦。这可以使用一行 PHP 代码在本地生成。
    • 他想要一个“默认”密码,上面的工具只是生成哈希而不存储。我的建议只是因为他想要一种“简单”的方式来生成这些哈希。
    • EbrahimMohammed,我同意@tadman 重新访问某个未知站点。更重要的是,这并没有简化事情,反而使事情复杂化了,转到远程站点而不是在应用程序内部以原生方式实现目标——事实证明,只需一行代码。
    • 啊。那是有道理的!今天学到了一些新东西:哦,说实话,我有时会使用该网站 - 但仅限于在本地进行测试时
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多