2011-08-23 61 views
1

当我尝试将新用户的密码放入MySQL数据库时,它不会正确加密它。这里是我使用的代码:这些密码有什么问题?

$encPassword = hash('sha256', $_POST['password']); 
    $query = sprintf("INSERT INTO users(`userName`,`email`,`password`) 
     VALUES('%s','%s',PASSWORD('%s'))", 
     mysql_real_escape_string($_POST['userName']), 
     mysql_real_escape_string($_POST['email']), 
     mysql_real_escape_string($encPassword))or die(mysql_error()); 
    $sql = mysql_query($query); 

虽然我检查数据库,但它不存储密码为SHA256加密。它只有16个随机字符(应该有50个)。它出什么问题了?

+0

是您的字段VARCHAR具有适当的长度吗? – mkk

+0

数据库中的密码字段是什么类型? –

+0

我会推荐CHAR(64)或BINARY(256)。不是说它有很大的区别,我想:) – Ryan

回答

3

我不认为你应该使用PASSWORD关键词:http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html#function_password

的PASSWORD()函数在 使用的认证系统的MySQL服务器;你不应该在你自己的应用程序中使用它。对于 这个目的,请考虑MD5()或SHA1()。有关在您的应用程序中安全地处理密码和验证 的更多信息,请参阅RFC 2195, 第2部分(质询 - 响应验证机制(CRAM)), 。

但是,您已经在第一行代码上散列了密码。只需将其直接插入数据库中...

+0

sha256是一个* hash *函数,不是加密算法。散列算法被设计为单向的,即。不可逆的。你应该编辑你的答案,说“哈希”,而不是“加密”。 –

+0

我已经改变它更具体。但在我的辩护中,“加密”并不是错的 - 散列只是一种特定类型的加密。 –

+1

我必须不同意(请参阅http://stackoverflow.com/questions/326699/difference-between-hashing-a-password-and-encrypting-it)。散列和加密都在* cryptography *领域,但它们有根本的不同。散列是不可逆的,而根据定义,加密必须是双向的。每个加密函数都必须有一个解密函数。 –

4

检查您的表格中允许使用正确的列长度。这是最常见的问题。您的字段必须至少为VARCHAR(64)

+0

@minitech:我不确定。是。抱歉,编辑 – genesis

+0

对不起,我刚刚看到OP使用'PASSWORD',根据http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html#将结果存储在41个字符中function_password。无所谓:P – Ryan

+0

@minitech:没关系,他也可以用64,也不会杀了他:) – genesis

0

您是否在INSERT之前检查了$encPassword的值?

0

这是因为您在查询中使用了PASSWORD('%s')函数(因此您要对密码进行双重散列处理)。

只需插入为其它值('%s'