簡體   English   中英

苦苦於在數據庫字段中存儲加密信息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM