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