我保护MySQL数据库密码的方法是否安全?

时间:2012-09-30 14:19:37

标签: php mysql database-connection password-encryption

使用时:

$con = mysql_connect('localhost','user','password')

我已经了解了将密码部分存储在其他地方(https://stackoverflow.com/a/3354457/1704651)的好处。

我对PHP很陌生,想知道我的MySQL密码存储方法是否安全:

  1. 第一步,选择一个冗长的MySQL数据库密码(https://www.random.org/passwords/?num=1&len=24&format=html&rnd=new
  2. 第二步,将其放入/outweweweot/salt.php(我的实际盐更长)

    <?php $salt = sdcjbdt8veADJbyuQxsfJtYeW7tC5; ?>
    
  3. 第三步,使用临时PHP文件(使用后删除)对密码进行编码:

    $decrypted = "my decrypted MySQL password"
    $key = $salt;
    $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $decrypted, MCRYPT_MODE_CBC, md5(md5($key))));
    var_dump($encrypted);
    
  4. 第四步,将此代码放入.htaccess

    SetEnv encrypted-password i3NOByNkztBtEbJ8LJMt2GbX9VjMzO2MTYtBXsxyYVI=
    
  5. 第五步,将此代码放在需要连接数据库的位置:

    require_once("../../outside-webroot/salt.php")
    $key = $salt
    $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($encrypted-password), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
    $con = mysql_connect('localhost','user',$decrypted)
    
  6. /outweweotot/salt.php中的salt与我在数据库中使用哈希密码的那个相同,所以我只需要将它包含一次用于两次。

    我在这里看到的加密/解密方法:http://ideone.com/yQIAX

    我也看到过这种方法:https://stackoverflow.com/a/3354457/1704651使用哈希而不是加密/解密方法。

    感谢您对我的方法的反馈。

2 个答案:

答案 0 :(得分:1)

没有。如果有人可以获取您的文件或运行程序,那就是游戏结束:

  1. 如果您的网络目录是可写的,我只需在echo $decrypted;上方添加一行mysql_connect()并获取密码。
  2. 我可以将文件复制下来并在那里进行编辑。
  3. 安全是您经历的一个过程,而不是您可以链接到程序中的某个库。

    • 您应该将配置存储在php.ini文件中,这样您的程序只需要mysql_connect()(不带参数)。这是一个好主意,因为攻击者可能更容易说服您的系统打印出源代码和Web可访问文件,而不是在您的系统上打印任意文件。

    • 在OSX和Linux等Unixish系统上,您应该确保使用的unix域套接字不会将MySQL服务器暴露给Internet;如果某人不在Internet上,则无法连接到您的MySQL服务器。这为“获取文件”攻击提供了进一步的保护。

    • 注意不要让您的网络用户创建php文件(或任何其他可执行文件)。这为“运行程序”攻击提供了一些保护,

    • 如果我可以上传/编辑您的文件,我可以做任何他们可以做的事情,所以您还应该注意放在MySQL服务器中的GRANT语句:如果只有管理员需要要对某些表执行某些INSERTDELETE,请考虑将管理脚本作为具有单独权限的单独Web用户运行。如果您的脚本无法删除所有数据,那么我作为攻击者也不能删除。

答案 1 :(得分:1)

安全的第一条规则是,如果你不确定自己是否安全,那么你可能不是。

下一版本的PHP(v5.5)将内置一组函数,提供标准化的密码散列。一旦发布此版本,这将是唯一推荐的处理密码的方法。

同时,您可以下载一个兼容库,该库为当前的PHP版本实现相同的功能。从这里下载:https://github.com/ircmaxell/password_compat

另请参阅:http://www.h-online.com/open/news/item/PHP-5-5-should-reduce-password-sloppiness-1707835.html以供参考。