繁体   English   中英

PHP使用mcrypt并将加密存储在MySQL中

[英]PHP using mcrypt and store the encrypted in MySQL

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

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

我是否必须使用特殊的字符集或是否有另一种简单的方法?

此致,Cr41s3

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

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

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

  • 解密:从MySQL加载加密的base64编码文本> Base64 Decode> MCrypt Decrypt - > Orignal Text

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

<?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

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和预处理语句,那么,要在mysql中存储二进制数据,首先使用base64_encode()进行转换,因此它只包含可打印字符。

我现在使用Ryan Vincent方法

我'base64_encode'加密字符串,然后将它们存储在数据库中。 这是一种非常“安全”的编码'二进制字符串'的方法。 它们可以通过HTML,电子邮件等在系统之间传递,永远不会被更改。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM