2014-11-05 33 views
1

我正在使用Mcrypt加密某些字符串。PHP使用mcrypt并将加密存储在MySQL中

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

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

问候, Cr41s3

+0

什么是您的数据库编码? – vaso123 2014-11-05 11:40:42

+0

latin1是我的实际编码 – Cr41s3 2014-11-05 11:44:27

+2

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

回答

8

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

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

  • 加密:一部开拓创新的文本>这个Mcrypt加密> Base64编码>存储在MySQL的纯文本

  • 解密:加载加密的base64编码来自MySQL的文本> Base64解码> MCrypt解密 - > 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 
2

1)存储在MySQL二进制东西,使用类型BINARY/VARBINARY/BLOB代替CHAR/VARCHAR/TEXT

2)当保存二进制数据DB,则使用方法将不会对“文本”应用任何处理(您不希望将二进制数据处理为某些字符串)。最好的办法是使用mysqli或PDO的准备好的语句。 3)如果你出于某种原因希望'看到数据库中的二进制文件',那么你需要使它们具有一定的可读性。使用SELECT hex(binary_field)SELECT TO_BASE64(binary_field)

4)如果您拒绝使用BLOB并准备好语句,那么要将二进制数据存储在mysql中,请先使用base64_encode()将其转换,以便它只包含可打印字符。

1

我现在使用的method by Ryan Vincent

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

我首先用base64_encode编码所有东西,然后将它存储在我的数据库中。

+0

以及您在数据库中使用哪种类型的字段 – 2016-07-15 19:09:13

相关问题