回答
简短的回答是:你不要。你实际存储的是通过单向散列函数运行用户密码的结果。之前我会想到使用像MD5这样的东西会没事的,直到我看到this,并建议看看bcrypt,因为它可以帮助抵御暴力攻击。
许多致力于bcrypt upvotes在这里。散列用户密码以对存储的密码进行测试的情况相对较少,因此使用.1s来执行该操作应该不成问题。但是,尝试在相同的10/s下对哈希进行强力攻击,并且永远不会完成。随着硬件标准的提出,Bcrypt也可以进行调整,以便进行更多的工作,从而使其兼容。 – 2011-04-01 13:05:12
是的,是什么促使我bcrypt读到一个网站被黑客入侵,他们的用户数据库被下载。在这种情况下,如果您使用快速哈希,那么可以避免攻击者通过密码强制攻击。 – 2011-04-01 16:30:25
@JosephMastey我很怀疑。如果你用.1s来测试密码,你的服务器是不是很容易被DDoS攻击? – 2013-01-19 18:07:52
存储密码的简单但安全的方法是使用MD5加密。
md5($password);
将给出md5加密值。
你要存储原始密码,这样
md5($password)
登录脚本schould是这样的:
$sql = "SELECT `id` WHERE username=`$username` AND password=`" . md5($password) . "`";
$result = mysql_query($sql,$link);
if (mysql_num_rows($result) == 1) {
// user is authenticated
}
这实际上应该更加复杂,但对于概念化来说,它已经被简化了。
单独使用密码使用MD5是不安全的。它可以使用[彩虹表](http://en.wikipedia.org/wiki/Rainbow_table)进行攻击(一个表包含MD5散列,用于查找应用于MD5函数的原始值的可能值)。 – VCD 2013-07-23 04:11:53
本示例不包含腌制密码或高级哈希方法。它只是一个简单的用户查找,无需返回任何用户名和密码。 – 2013-07-23 13:34:36
我对这个答案的理解是,它鼓励人们用MD5散列密码并将其存储在数据库中,这已知是不安全的。如果这个例子只是简单地做一个用户查询,那么这个答案与询问如何存储密码的问题无关。此外,我不认为简单的用户查找应该使用密码作为过滤条件。 – VCD 2013-07-24 02:25:11
散列在存储密码中很常见。但它们都是一样的,只是它产生的哈希结果越长,被黑客攻击的难度就越大。来自相同散列函数的散列结果通常具有相同的长度。对输入文本(长度无限制)没有限制,可以从多个句子/单词中产生1个相同的散列字符串。这是洞所在的地方。阅读更多关于pigeonhole principle和Birthday Attack
我通常使用MD5()。但它已经超出了我猜测的标准,因为一些碰撞事情。不知何故,人们发明了一种可以检测1个散列字符串的系统,其中多个实际字符串为 。
使用SHA代替。为了使它更安全,你可以在它上面添加$ salt,使它成为双重保护,所以,首先对实际密码进行哈希,将哈希值加入哈希密码,然后再次哈希它们。
请记住,结果字符串越长越好。
一些推荐bcrypt,但我从来没有使用过它。
谢谢我从来不知道鸽子的原理。 – PHP 2011-04-01 02:24:34
为了让事情变得简单,使用带有盐的md5。 MD5是单向散列。例如:
md5("hello") = "5d41402abc4b2a76b9719d911017c592"
所以,没有盐,你挽救了“5d41402abc4b2a76b9719d911017c592”到你的数据库。然后,当您尝试通过输入密码进行登录时,您会将输入密码的md5与您保存的md5进行比较。
if (md5($input_password) == "5d41402abc4b2a76b9719d911017c592")
log_in_user();
但是,md5是不安全的,因为x的md5总是y。因此,如果您要破坏数据库并找到列为“y”的密码,那么如果您创建或下载了md5查找表,则知道该密码为“x”。
而是做这样的事情:
$password_to_save_to_db = md5(md5($input_password . $date_user_registered));
因此,每个用户都会有自己独特的盐和这些查询表将变得毫无用处。 (这可能是黑客想偷每个密码重新创建,但这是耗费更多的时间和加上双MD5使事情变得有点困难。
你可以阅读更多的http://sameerparwani.com/posts/using-salts-for-extra-security
- 1. 安全存储密码的最佳方法
- 2. 在MySQL中使用/存储加密密钥的最佳方法是什么
- 3. 存储密钥的最佳做法
- 4. 加密/解密字符串和密钥存储方法的最佳算法
- 5. 什么是安全存储密码(散列)的最佳方式
- 6. Play Framework 2存储用户密码哈希的最佳方式
- 7. 保护SQL密码的最佳方法
- 8. 存储MySQL密码
- 9. 在mysql中存储html代码的最佳方式是什么?
- 10. 存储查找值的最佳方法
- 11. xml数据存储的最佳方法
- 12. 存储文本的最佳方法?
- 13. 存储位图的最佳方法
- 14. 存储数据表的最佳方法
- 15. 存储“时间”值的最佳方法
- 16. 什么是存储AES加密密钥的最佳方式?
- 17. 什么是存储加密密钥的最佳方式?
- 18. ,保存密码的最佳方法是什么?
- 19. 在MySQL数据库中存储数组的最佳方法?
- 20. 在mysql中存储大数据的最佳方法
- 21. 在MySQL中存储Hijri日期的最佳方法?
- 22. MySQL:存储MAC地址的最佳方法?
- 23. 在mysql数据库中存储python time.struct_time的最佳方法
- 24. 在mysql中存储短数字的最佳方法
- 25. 在MySQL中存储“额外”用户数据的最佳方法?
- 26. 在MySQL中存储测验结果的最佳方法
- 27. 保存加密/解密密钥的最佳方法是什么?
- 28. 加密密码的最佳算法
- 29. 存储过程验证最佳方法
- 30. 本地存储最佳方法
存储密码一个MySQL数据库或在MySQL中存储密码... – deceze 2011-04-01 02:00:50
您的意思是在MySQL中存储密码,或者存储您的程序中需要访问数据库的MySQL密码? – Sergey 2011-04-01 02:01:05
在存储用户密码的表中 – PHP 2011-04-01 02:05:14