【问题标题】:Encryption using mcrypt, PHP, and MySQL使用 mcrypt、PHP 和 MySQL 进行加密
【发布时间】:2011-08-11 02:23:02
【问题描述】:

我正在尝试使用 mcrypt 在我的数据库中存储密码。首先,它有效,但仅在某些时候有效。

这是我的加密代码:

    //Encryption/Decryption key
    $key = $username.$username.$username.$username.$username;
    //Encryption Algorithm
    $cipher_alg = MCRYPT_RIJNDAEL_256;

    $iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher_alg, MCRYPT_MODE_ECB), MCRYPT_RAND);
    $password = mcrypt_encrypt($cipher_alg, $key, $pass1, MCRYPT_MODE_CBC, $iv);

然后将 $username、$iv 和 $password 上传到 MySQL 数据库。

这是我的解密代码:

    //Encryption/Decryption key
    $key = $username.$username.$username.$username.$username;

    //Encryption Algorithm
    $cipher_alg = MCRYPT_RIJNDAEL_256;

    $dbpass = mcrypt_decrypt($cipher_alg, $key, $encpass, MCRYPT_MODE_CBC, $random);
    $dbpass = trim($dbpass); // Trim the fat

从数据库中检索 $username、$iv 和 $encpass(加密密码)并使用用户名重新创建密钥。

这可行,但只是有时。我不知道为什么。我唯一的假设是数据库不能接受加密产生的某些字符,例如引号。

任何帮助将不胜感激!

【问题讨论】:

  • 请向我们展示您用于将数据插入数据库的代码,以及用于检索数据的代码。我们还需要知道表的结构。另外,为什么你在 ECB 模式下获取 IV,但在 CBC 模式下加密?
  • 据我所知,算法取决于密钥和 IV 大小,用户名既不能用于传递也不能用于密钥.. 你不能依赖用户输入!!

标签: php mysql encryption mcrypt


【解决方案1】:
$salt = time(); // I would use something other than time(), something more random

// store it in the db and redirect user
connect();
$query = mysql_query("INSERT INTO user VALUES
                      ('".mysql_real_escape_string($username)."',
                       '".mysql_real_escape_string(sha1($password . $salt))."',
                       '".mysql_real_escape_string($salt)."') ");

// returning user
$username = $_POST['username'];
$password = $_POST['password'];

// retrieve stored password
connect();
$result = mysql_query("SELECT * FROM user WHERE username = '".mysql_real_escape_string($username)."' ");
$row = mysql_fetch_assoc($result);
if (!$result) {
// user doesn't exist
}
$storedPassword = $row['password'];
$salt = $row['salt'];

$hashedPassword = sha1($password . $salt);

if ($storedPassword != $hashedPassword) {
// exit
}
else {
// redirect user
}

我并不是说这是最安全的,它只是使用盐进行哈希的一种方式的一个小例子。

【讨论】:

  • 这里有大量的文档和来自那些在安全方面有更多经验的人提供的帮助。你会在 stackoverflow 中找到一些很好的技巧。
  • 我在这里找到了一个很好的哈希指南:elbertf.com/2010/01/store-passwords-safely-with-php-and-mysql 但是暂时忘记密码,为什么我的加密不起作用?
【解决方案2】:

您可以尝试以下代码进行 2 路加密。您可以根据需要添加带密码的盐。

$key = 'ecryptionkey';
$string = 'password';

$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));   
$decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($encrypted), MCRYPT_MODE_CBC, md5(md5($key))), "\0");

var_dump($encrypted);
var_dump($decrypted);

我从下面的 URL 获得了这段代码,并在我的应用程序中使用它。

https://stackoverflow.com/a/9262137/1724762

【讨论】:

    【解决方案3】:

    如果您在数据库中存储用户的密码,您应该使用单向哈希

    这里只是一个非常简约的例子

    $username = $_POST['username'];
    $password = $_POST['password'];
    $salt     = 'Some Salt';
    
    $result = mysql_query("SELECT username, password
                           WHERE username = '".mysql_real_escape_string($username)."'
                           AND   password = '".mysql_real_escape_string(sha1($password . $salt))."'
                           LIMIT 1");
    
    if(mysql_num_rows($result)) {
    // we have a match
    }
    else {
    // no match
    }
    

    在我的示例中,您必须使用 sha1 插入带有附加盐的用户密码。请记住,这只是在数据库中存储用户密码的建议。

    【讨论】:

    • 这个页面已经有几年历史了,但它仍然提供了一些很好的见解ibm.com/developerworks/opensource/library/os-php-encrypt
    • 嗯,我想最终两者都做。我打算先用盐对其进行哈希处理,然后再加密。我的想法是,如果我的数据库被盗,他们将拥有 $iv 和 $password,如果他们获得了我的 PHP,他们将拥有 $key 和 $salt,但如果没有这两者,他们将无能为力。这是正确的吗?哦,无论如何,如果我无法弄清楚为什么我的密码/$iv 可能无法正确存储,那对我没有好处。我应该使用 addlash 吗?
    • mysql_real_escape_string 是转义字符串的正确方法。就在数据库中存储密码而言,一种方法哈希绝对是要走的路。我会发布一些示例代码,可能会对您有所帮助
    【解决方案4】:

    同意对于您的特定用例(存储用户的密码),最好使用单向哈希。

    但对于确实需要使用 mcrypt 以及 PHP 和 MySQL 的人,请参阅 MySql insert binary data to db without errors 中的各种选项。一个简单的选择是base64_encode/base64_decode -- here's an example

    【讨论】:

      猜你喜欢
      • 2013-04-14
      • 1970-01-01
      • 2012-11-06
      • 2015-11-10
      • 2011-01-31
      • 2013-08-13
      • 2015-01-01
      • 2011-01-24
      • 2015-09-04
      相关资源
      最近更新 更多