我正在使用Mcrypt加密某些字符串。PHP使用mcrypt並將加密存儲在MySQL中
之後,我將它們存儲在我的數據庫中,但在我的數據庫中它看起來像「?? f ?? R ????? h $」,因爲許多特殊字符被替換爲'?'。
我必須使用特殊的字符集還是有另一種簡單的方法?
問候, Cr41s3
我正在使用Mcrypt加密某些字符串。PHP使用mcrypt並將加密存儲在MySQL中
之後,我將它們存儲在我的數據庫中,但在我的數據庫中它看起來像「?? f ?? R ????? h $」,因爲許多特殊字符被替換爲'?'。
我必須使用特殊的字符集還是有另一種簡單的方法?
問候, Cr41s3
我想你可能會將加密字符串的字節直接保存到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
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()將其轉換,以便它只包含可打印字符。
我現在使用的method by Ryan Vincent:
我'base64_encode'加密的字符串然後將它們存儲在數據庫中。這是編碼'二進制字符串'的一種非常「安全」的方式。它們可以通過HTML,電子郵件等方式在系統之間傳遞,永遠不會改變。
我首先用base64_encode
編碼所有東西,然後將它存儲在我的數據庫中。
以及您在數據庫中使用哪種類型的字段 – 2016-07-15 19:09:13
什麼是您的數據庫編碼? – vaso123 2014-11-05 11:40:42
latin1是我的實際編碼 – Cr41s3 2014-11-05 11:44:27
我'base64_encode'加密的字符串,然後將它們存儲在數據庫中。這是編碼'二進制字符串'的一種非常「安全」的方式。它們可以通過HTML,電子郵件等在系統之間傳遞。並永遠不會改變。 – 2014-11-05 11:45:18