【发布时间】:2014-03-26 23:24:36
【问题描述】:
我在 phpmyadmin 中有一个包含用户名和密码的表,但密码字段未加密。我想将密码字段的整个列加密为 SHA1 格式。知道该怎么做吗?
【问题讨论】:
我在 phpmyadmin 中有一个包含用户名和密码的表,但密码字段未加密。我想将密码字段的整个列加密为 SHA1 格式。知道该怎么做吗?
【问题讨论】:
首先,请阅读How to securely hash passwords?。
然后您可以寻找要使用的 PHP PBKDF2、Bcrypt 或 Scrypt 实现。
在数据库中,您需要:
如果你真的喜欢(并且不推荐),你可以创建一个类似PBKDF2 的 MySQL 实现,并且由于 MySQL 5.5.5 及更高版本有一个SHA-512 function,你也许可以使用一个@以 987654326@ 为例,但请务必对照known test vectors 进行验证。
【讨论】:
此时甚至不要单独使用 SHA-1 哈希,它本身被认为不够安全。
查看来自 OWASP 的Password Storage Cheat Sheet。除了为每个用户使用唯一的盐对密码进行加盐之外,您还应该使用更强大的加密功能。
如果你有 PHP 5.5,你可以使用 PHP 的 password_hash() 函数,它使用 bcrypt 算法,或者如果你没有 PHP 5.5,你可以使用 ircmaxell 的 PHP implementation。
如果此时您只使用 SHA-1,您甚至不必费心,因为您数据库中的大多数密码可能已经在 SHA-1 彩虹表中。
要更新您的数据库,请编写一个简短的 PHP 脚本来读取数据库中的每个密码,应用散列函数,然后使用新的散列密码更新该行。然后修改您的注册和登录函数以在将输入的密码与存储在数据库中的密码进行比较时使用新的哈希函数。
【讨论】:
你也应该对你的密码加盐:https://crackstation.net/hashing-security.htm
【讨论】:
对于今天的安全标准,我会这样做:
用法很简单:
$plain_password="messi";
$hash=create_hash($plain_password);
$hash 是一个数组,包含您需要保存到数据库的所有数据
array(4) {
[0]=>
string(6) "sha256"
[1]=>
string(4) "1000"
[2]=>
string(32) "wJnwu2uA4rVdW8Momz3CgS8W7MdEmaLH"
[3]=>
string(32) "0g2b0ZrpnObAx6z1L/8g8PPNbTG+92BI"
}
将其保存到数据库中,下次您必须将这些值检索为:
SELECT
CONCAT(password_algo, ":" ,password_iteration,":" , password_salt,":" , password_hash)
FROM users WHERE userEmail='messi@argentina.com';
在验证函数中使用字符串结果
validate_password($password_to_validate, $stored_hash_from_db)
如果有效,您将得到 True,否则为 False。
【讨论】:
update mytable set password=sha1(password)
您至少应该验证列定义是否能够容纳 40 个字符,否则会使情况变得更糟。
我希望您知道,从那时起,您还应该在发送和/或与数据库比较之前重写您的代码以加密密码。
【讨论】: