【问题标题】:Decrypting passwords that are stored on server with mcrypt使用 mcrypt 解密存储在服务器上的密码
【发布时间】:2015-04-08 16:11:39
【问题描述】:

所以我有一个表,它使用 MCRYPT_RIJNDAEL_128 加密在 varbinary 下加密了用户名和密码。我可以很好地存储加密的详细信息,但我在解密它们时遇到了问题。我在用户注册时存储用户名、密码和 IV。

$query = "INSERT INTO users ( username, password ) VALUES ( :user, :pass) ";

$encrypt_user = $_POST['username'];
$encrypt_pass = $_POST['password'];

$encrypted_user = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $secret_key, $encrypt_user, MCRYPT_MODE_CBC, $iv);
$encrypted_pass = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $secret_key, $encrypt_pass, MCRYPT_MODE_CBC, $iv);
$encrypted_cardnumber = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $secret_key, 

$query_params = array(
    ':user' => $encrypted_user,
    ':pass' => $encrypted_pass,
);

try {
    $stmt   = $db->prepare($query);
    $result = $stmt->execute($query_params);
}
catch (PDOException $ex) {
    $response["success"] = 0;
}

这一切都很好,问题是我什么时候想解密。如何获取登录用户的 IV?我曾尝试在用户注册时将 iv 设置为会话变量,但我知道这仅在用户首次注册然后登录时才有效。

$query = "SELECT id, username FROM users WHERE username = :username";

$username = $_POST['username'];
$password = $_POST['password'];
//encrypting the username and password to compare to the ones stored in the databaase
$encrypted_username = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $secret_key, $username, MCRYPT_MODE_CBC, $iv);
$encrypted_password = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $secret_key, $password, MCRYPT_MODE_CBC, $iv);

【问题讨论】:

    标签: php encryption passwords mcrypt


    【解决方案1】:

    只是不要加密用户名,因为这不是敏感信息。但是您应该将方法从加密更改为散列。因为有了 IV 和 secret_key,就可以解密密码。

    【讨论】:

    • 但是即使我不加密用户名,我如何解密某人输入的密码,表中可能有很多IV。
    • 您已经有一个按用户名查询的存根。当您将 IV 也存储在数据库中时,您首先通过用户名获取数据库条目,然后使用 IV 对给定密码进行哈希处理,并检查哈希密码是否与数据库中的密码匹配
    • 让我试一试。
    • 和使用php5.5的时候看看here
    • 嘿,谢谢你的指点,我明白了!我没有改成散列,但没有像你说的那样加密用户名。
    猜你喜欢
    • 2013-12-28
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 2011-01-27
    • 2015-11-10
    • 2012-02-12
    • 1970-01-01
    相关资源
    最近更新 更多