【发布时间】:2015-03-28 18:44:27
【问题描述】:
我有一个加密和解密文本的功能。每次刷新时,加密总是不同的,解密的总是与原始字符串相同。我将加密更新到 sql 数据库。我不能使用简单的"SELECT * FROM mytable WHERE MyField = 'Myencryption';",因为'Myencryption' 每次都会不同。如何在 SQL 中搜索 Mycrypt 加密?有什么建议?
我的代码如下:(我有一个 PDO SQL 类)
// Encrypt Function
private function encrypt($encrypt, $key){
$encrypt = serialize($encrypt);
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC), MCRYPT_DEV_URANDOM);
$mac = hash_hmac('sha256', $encrypt, substr(bin2hex($key), -32));
$passcrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $encrypt.$mac, MCRYPT_MODE_CBC, $iv);
$encoded = base64_encode($passcrypt).'|'.base64_encode($iv);
return $encoded;
}
// Decrypt Function
private function decrypt($decrypt, $key){
$decrypt = explode('|', $decrypt.'|');
$decoded = base64_decode($decrypt[0]);
$iv = base64_decode($decrypt[1]);
if(strlen($iv)!==mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC)){ return false; }
$decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $decoded, MCRYPT_MODE_CBC, $iv));
$mac = substr($decrypted, -64);
$decrypted = substr($decrypted, 0, -64);
$calcmac = hash_hmac('sha256', $decrypted, substr(bin2hex($key), -32));
if($calcmac!==$mac){ return false; }
$decrypted = unserialize($decrypted);
return $decrypted;
} // End Decrypt
$this->db->query("SELECT * FROM `$this->main_db`.`$this->apps_tbl` WHERE `2` = ':db_name'");
$this->db->bind(':db_name', $app_id);
$row = $this->db->single();
【问题讨论】:
-
这是不可能的,加密背后的整个想法是你无法解密它。加密是一种方式。您应该使用两种方式的哈希。
-
@Daan 你倒退了。散列是单向的。加密是双向的。
-
@Daan 走错路了。加密是两种方式,哈希是一种方式。
-
@TVarcor 为什么每次都更改加密密钥?为此,您需要知道用于加密数据的密钥(这就是为什么密钥通常对于所有内容都是恒定的),然后在运行 mysql 查询之前加密数据。
-
@Styphon $key 变量没有改变,我有相同的主键。即使加密发生了变化,它总是能正确解密
标签: php mysql encryption pdo