【问题标题】:PHP mcrypt and SQL Where for Encrypted Info?PHP mcrypt 和 SQL 在哪里获取加密信息?
【发布时间】: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


【解决方案1】:
SELECT * FROM mytable WHERE 'text' = AES_DECRYPT(MyField, 'Your 256 key');

但是如果你的表中有很多行或者服务器很弱,这种方式可能会很慢。

【讨论】:

    猜你喜欢
    • 2013-11-03
    • 1970-01-01
    • 2016-04-13
    • 2011-01-24
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    相关资源
    最近更新 更多