比较密码和用户名的准确性:utf8_general_ci或utf8_bin?

时间:2011-01-24 16:46:59

标签: mysql database-design collation password-protection

我在这里看了一篇文章, utf8_bin 让我们在比较字符时更准确,而 utf8_general_ci 没有。

我想知道 - 如果我有一个存储用户名和密码的表,并且当用户登录我的网站时我需要它们是准确或正确的。

那么我应该为此目的使用 utf8_bin 吗?

感谢。

修改

顺便说一句,这是我用来拥有密码的哈希函数,

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

    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 个答案:

答案 0 :(得分:1)

你在谈论整理 - 这是MySQL表支持的字符。排序规则中的“_ci”表示排序规则是Case Insensitive。含义,“a”==“A”,而在区分大小写的排序规则中,该示例将评估为假。

所以是的,选择区分大小写的排序规则可以提供更好的准确性。您可以使用不区分大小写的排序规则存储值,但使用COLLATE function为查询评估设置特定值。

答案 1 :(得分: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']);