[英]Struggling to store encrypted info in database field
我在mysql數據庫中存儲加密信息存在很大問題,引擎mySam
我加密這樣的信息:
function in($plaintext) {
$cipher = 'rijndael-256';
$mode = 'cbc';
$key = 'key';
$td = mcrypt_module_open($cipher, '', $mode, '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $key, $iv);
$crypttext = mcrypt_generic($td, $plaintext);
mcrypt_generic_deinit($td);
return $iv.$crypttext;
}
然后將數據存儲在blob中。 當我來解密信息時,由於存儲在數據庫中,大約有10%的時間它已被破壞。
我可以驗證它是數據庫是問題,因為我已經運行腳本來大規模加密和解密數據沒有問題。
有任何想法嗎? 提前致謝...
[編輯解密程序]
function decrypt($crypttext)
{
$cipher = 'rijndael-256';
$mode = 'cbc';
$key = '$key';
$plaintext = '';
$td = mcrypt_module_open($cipher, '', $mode, '');
$ivsize = mcrypt_enc_get_iv_size($td);
$iv = substr($crypttext, 0, $ivsize);
$crypttext = substr($crypttext, $ivsize);
if ($iv)
{
mcrypt_generic_init($td, $key, $iv);
$plaintext = mdecrypt_generic($td, $crypttext);
}
return $plaintext;
}
我非常懷疑你遇到了一個mysql數據庫錯誤......“已損壞”如何? 我們能看到你的解密例程和測試腳本嗎? 這不僅僅是你遇到的塊大小的填充嗎?
填充:crypt algos通常用於數據塊(使用128位) - 輸入(因而輸出!)數據將被填充到此長度,您需要存儲整個填充的輸出字符串 - 可能還有非長度-padded輸入,如果您的輸入數據是填充無法在解密后自動確定和刪除的形式。
在MySQL中保護明文密碼並不是一個好主意...也為什么不使用SHA1或MD5哈希...你會得到更多的反應,然后根據你的需要改變算法。
基本上
SELECT SHA1(“SecretPassword”)將= 08cd923367890009657eab812753379bdb321eeb或blabityboo
SHA1將存儲為40個字符,這意味着您可能應該將數據類型從BLOB更改為varchar,或者nvarchar()<---可能是varchar ...
如果沒有算法的構造,我們無法判斷字段的長度,因此有關填充的注釋。
使用SELECT CHARACTER_LENGTH(“SecretPassword”)選擇傳遞時,您將獲得加密字段的長度。 然后你可以創建適當的約束。
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.