【问题标题】:PHP using mcrypt and store the encrypted in MySQLPHP使用mcrypt并将加密存储在MySQL中
【发布时间】:2015-01-01 14:14:10
【问题描述】:

我正在使用 Mcrypt 加密一些字符串。

之后我将它们存储在我的数据库中,但在我的数据库中它看起来像“??f??R?????h$”,因为许多特殊字符被替换为“?”。

我必须使用特殊的字符集还是有其他简单的方法?

问候, Cr41s3

【问题讨论】:

  • 你的数据库编码是什么?
  • latin1 是我的实际编码
  • 我'base64_encode'加密字符串,然后再将它们存储到数据库中。这是编码“二进制字符串”的一种非常“安全”的方式。它们可以通过 HTML、电子邮件等在系统之间传递,并且永远不会改变。
  • 所以这就是问题所在。由于 latin1 只能存储拉丁字符。尝试改用 UTF8。

标签: php mysql mcrypt


【解决方案1】:

我现在使用method by Ryan Vincent

在将字符串存储到数据库之前,我对字符串进行了“base64_encode”加密。这是编码“二进制字符串”的一种非常“安全”的方式。它们可以通过 HTML、电子邮件等在系统之间传递,并且永远不会更改。

我首先使用base64_encode 对所有内容进行编码,然后将其存储在我的数据库中。

【讨论】:

  • 以及您在数据库中使用什么类型的字段
【解决方案2】:

1) 要在 mysql 中存储二进制内容,请使用 BINARY/VARBINARY/BLOB 类型而不是 CHAR/VARCHAR/TEXT

2) 将二进制数据保存到 DB 时,请使用不会对“文本”进行任何处理的方法(您不希望处理二进制数据,因为它是一些字符串)。最好的办法是使用 mysqli 或 PDO 的准备好的语句。

3) 如果您出于某种原因想要“查看 DB 中的二进制内容”,则需要使它们具有一定的可读性。喜欢使用SELECT hex(binary_field)SELECT TO_BASE64(binary_field)

4) 如果你拒绝使用 BLOB 和prepared statements,那么,在mysql中存储二进制数据,首先使用base64_encode()转换它们,所以它只包含可打印的字符。

【讨论】:

    【解决方案3】:

    我认为您可能会将加密字符串的字节直接保存到 mysql 数据库中。

    你可以这样做来解决你的问题:

    • 加密:原始文本 > MCrypt 加密 > Base64 编码 > 在 MySQL 中存储为纯文本

    • 解密:从 MySQL 加载加密的 base64 编码文本 > Base64 解码 > MCrypt 解密 -> 原始文本

    这就是我的做法。创建一个类来做加密/解密:

    <?php
    
    class cipher
    {
        private $securekey;
        private $iv_size;
    
        function __construct($textkey)
        {
            $this->iv_size = mcrypt_get_iv_size(
                MCRYPT_RIJNDAEL_128,
                MCRYPT_MODE_CBC
            );
            $this->securekey = hash(
                'sha256',
                $textkey,
                TRUE
            );
        }
    
        function encrypt($input)
        {
            $iv = mcrypt_create_iv($this->iv_size);
            return base64_encode(
                $iv . mcrypt_encrypt(
                    MCRYPT_RIJNDAEL_128,
                    $this->securekey,
                    $input,
                    MCRYPT_MODE_CBC,
                    $iv
                )
            );
        }
    
        function decrypt($input)
        {
            $input = base64_decode($input);
            $iv = substr(
                $input,
                0,
                $this->iv_size
            );
            $cipher = substr(
                $input,
                $this->iv_size
            );
            return trim(
                mcrypt_decrypt(
                    MCRYPT_RIJNDAEL_128,
                    $this->securekey,
                    $cipher,
                    MCRYPT_MODE_CBC,
                    $iv
                )
            );
        }
    }
    
    ?>
    

    然后像这样使用它:

    // Usage
    $cipher = new cipher('my-secret-key');
    $orignal_text = 'my secret message';
    $encrypted_text = $cipher->encrypt($orignal_text);   // store this in db
    $decrypted_text = $cipher->decrypt($encrypted_text); // load $encrypted_text from db
    
    // Debug
    echo "<pre>";
    echo "Orignal Text  : $orignal_text\r\n";
    echo "Encrypted Text: $encrypted_text\r\n";
    echo "Decrypted Text: $decrypted_text";
    echo "</pre>";
    

    这分别输出以下内容:

    Orignal Text  : my secret message
    Encrypted Text: Z21ifr5dHEdE9nO8vaDWb9QkjooqCK4UI6D/Ui+fkpmXWwmxloy8hM+7oimtw1wE
    Decrypted Text: my secret message
    

    【讨论】:

      猜你喜欢
      • 2011-08-11
      • 2013-04-14
      • 2023-03-03
      • 1970-01-01
      • 2015-11-10
      • 2018-03-05
      • 2012-04-11
      • 2019-04-13
      • 2014-03-25
      相关资源
      最近更新 更多