簡體   English   中英

MySQL Row存儲加密的密碼

[英]MySQL Row to store encrypted passwords

我發現了一個很好的基本密碼類,現在我可以使用該類來轉換MySQL數據庫中的所有純文本密碼。 當前,包含密碼的行是varchar(64),但我認為應該將其轉換為char(128)。 誰能確認128長度足以滿足此類返回的加密哈希的要求?

我看到它用sha256散列密鑰,但是使用MCRYPT_RIJNDAEL_128,所以我不確定是否需要將長度設為char(128)或char(256)

<?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));
    }

}

?>

誰能確認128長度足以滿足此類返回的加密哈希的要求?

也許? 運行一些測試。 查看文檔。

當前,包含密碼的行是varchar(64),但我認為應該將其轉換為char(128)。

將其保留為VARCHAR ,將長度更改為VARCHARS作為字符串存儲在后端,外加一個或兩個字節表示長度。 1字節表示1到255,兩個字節表示256-65535。

例如:

包含單詞“ butts”的VARCHAR(255)在后端包含6個字節的存儲空間。

包含單詞“ butts”的CHAR(128)在后端包含128個字節的存儲空間。

據我所知, AES-256RIJNDAEL-128長256位,因此使用char(32)可能很安全。 (檢查從使用Mcrypt在PHP中實現AES的經驗教訓

無論如何,如果不確定,您始終可以使用VARCHAR(256)。 它的動態分配將確保您的安全,並且CHAR與VARCHAR的性能不會對您造成太大影響。

  • 您不需要加密哈希密碼。 哈希不可逆,因此很安全。

  • 您應在對密碼進行哈希處理之前為其添加鹽。 否則,請使用bcrypt,它會自動添加鹽分。

  • SHA256哈希的長度始終為256位,可以存儲為64個字符或32個二進制字節。 請參閱我對MySQL的回答:用於哈希密碼字段的數據類型和長度是多少?

  • 其他人建議使用VARCHAR(255),因為它只存儲給定字符串所需的字符。 對於存儲在數據行和索引中的情況確實如此,但是當將這些字符串從MySQL存儲引擎中復制並帶入MySQL的SQL結果集時,它們會臨時填充為完整的字符串長度。 因此,將VARCHAR(255)用作事實上的字符串列很浪費。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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