2011-01-24 50 views
0

我已經在這裏看到一篇文章utf8_bin給我們比較字符更準確,而utf8_general_ci沒有。比較密碼和用戶名的準確性:utf8_general_ci或utf8_bin?

我想知道 - 如果我有一個存儲用戶名和密碼的表,並且我需要它們在用戶登錄我的網站時是準確或正確的。

那麼我應該用utf8_bin達到這個目的嗎?

感謝。

編輯:

順便說一句,這是我使用的哈希函數有密碼,

function hash_sha512($phrase,&$salt = null) 
{ 
    //$pepper = '[email protected]#$%^&*()_+=-{}][;";/?<>.,'; 

    if ($salt == '') 
    { 
     $salt = substr(hash('sha512',uniqid(rand(), true).PEPPER_KEY.microtime()), 0, SALT_LENGTH); 
    } 
    else 
    { 
     $salt = substr($salt, 0, SALT_LENGTH); 
    } 

    return hash('sha512',$salt.PEPPER_KEY.$phrase); 
} 
+2

您應該將密碼存儲爲鹽漬散列。獎金:用哈希你不必擔心unicode(僅[a-f0-9]) – knittl 2011-01-24 16:51:21

+0

@ knittl:是的,我已經散列了所有的密碼。謝謝。 – laukok 2011-01-24 16:53:26

+0

@lauthiamkok:哈希值的格式是什麼? – Gumbo 2011-01-24 17:15:29

回答

1

首先是關於密碼存儲的問題......因爲您似乎在使用PHP(來自您的問題歷史記錄)......鹽漬sha1()哈希僅僅在租用幾個AWS實例來計算的世界中不會削減它快速的彩虹表... sha1()太快了。

爲什麼不相信實際專家在該領域製作的圖書館,而不是親自動手操作密碼學?使用Portable PHP password hashing framework

PHPass實際上使用bcrypt,這是一種旨在防止彩虹表,字典和蠻力攻擊的算法。你可以用幾輪來初始化它:輪次越高,計算哈希所用的時間就越長。這樣,如果處理能力增加,您可以創建更強大的哈希。

使用它很簡單:

require('PasswordHash.php'); 

$phpass = new PasswordHash(12, false); // Initiate for 12 rounds, using bcrypt 

// Hash a password 
$hash = $phpass->HashPassword('my secret password'); 

// Compare an hash to a given password 
$formSupplied = 'hello world'; 
$isRight = $phpass->CheckPassword($formSupplied, $hash); 

if($isRight) echo "Good"; 
else echo "Wrong"; 

現在對用戶名的主題...使用_bin整理(即:utf8_bin)存儲。這將迫使MySQL在WHERE期間進行二進制比較,並有效地使您的用戶名區分大小寫。然而,由於這是UTF-8,因此在插入和查詢數據之前規範化用戶名是非常重要的。不同的操作系統以不同的方式表示重音字符。 PHP有intl擴展,它具有UTF-8規範化功能。以下內容應該如下:

$_POST['username'] = Normalizer::normalize($_POST['username']); 
1

你在談論的整理 - 這是人物的MySQL表將支持。歸類中的「_ci」表示歸類不區分大小寫。意思是,「a」==「A」,而在區分大小寫的排序規則中,該示例將評估爲錯誤。

所以是的,選擇區分大小寫的排序規則會提供更好的準確性。您可以使用不區分大小寫的排序規則來存儲值,但可以使用COLLATE function爲查詢評估設置特定的值。