Php 使用mcrypt解密存储在服务器上的密码

Php 使用mcrypt解密存储在服务器上的密码,php,encryption,passwords,mcrypt,Php,Encryption,Passwords,Mcrypt,所以我有一个表,它使用MCRYPT_RIJNDAEL_128加密,在varbinary下加密用户名和密码。我可以很好地存储加密的详细信息,但我在解密它们时遇到问题。当用户注册时,我存储用户名、密码和IV $query = "INSERT INTO users ( username, password ) VALUES ( :user, :pass) "; $encrypt_user = $_POST['username']; $encrypt_pass = $_POST['password']

所以我有一个表,它使用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);

只是不要加密用户名,因为这不是敏感信息。但是您应该将方法从加密更改为哈希。因为使用IV和密钥可以解密密码。

但即使我不加密用户名,如何解密某人输入的密码,表中可能有许多IV。您已经有了按用户名查询的存根。当你将IV也存储在数据库中时,你首先通过用户名获取数据库条目,然后用IV散列给定密码,并检查散列后的密码是否与数据库中的密码匹配。让我试试。使用php5.5时,看一看嘿,感谢我得到的指针!我没有改成散列,但没有像你说的那样加密用户名。