我正在使用Mcrypt来加密某些字符串。
之后我将它们存储在我的数据库中,但是在我的数据库中,它看起来像是" ?? ?? ?? ?? ??????由于很多特殊的字符被&替换了#39;'
我是否必须使用特殊的字符集,还是有其他简单方法?
此致 Cr41s3
答案 0 :(得分:7)
我认为你可能会将加密字符串的字节直接保存到mysql数据库中。
你可以做这样的事情来解决你的问题:
加密:原始文字> 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 :(得分: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和预处理语句,以便在mysql中存储二进制数据,首先使用base64_encode()进行转换,因此它只包含可打印的字符。
答案 2 :(得分:1)
我现在使用method by Ryan Vincent:
我'base64_encode'加密字符串,然后将它们存储在数据库中。这是一种非常“安全”的编码'二进制字符串'的方法。它们可以通过HTML,电子邮件等在系统之间传递,永远不会被更改。
我首先使用base64_encode
对所有内容进行编码,然后将其存储在我的数据库中。