Is storing a salt in the MySQL table secure?
Possible Duplicate:
Best way to prevent SQL Injection in PHP
The necessity of hiding the salt for a hash
号
我对mysql和php非常陌生,在过去的几天里我已经开始自我学习,今天我正在研究密码加密等问题。我浏览了很多关于这个主题的网页,大多数网页都说要为表中的每个条目生成一个随机的salt(据我所知,你不想这样做)每个入口的盐),然后这些盐应该存储在入口旁边的桌子上。
据我所知(如果我错了,请纠正我),密码加密并不能阻止黑客访问它,而只是屏蔽了访问数据库时的真实值。当然,如果是这样的话,你也不想把salt存储在表中——如果黑客已经访问了数据库,并且能够看到加密的数据,向他展示salt只会让他的解密工作变得极其简单?
- 坦率地说,如果他们可以访问DB-游戏结束。除非你经营一家银行,否则你不必为安全发疯。
- 如果使用bcrypt散列方法,则不需要将salt存储在数据库中。您只需要存储哈希密码。salt包含在哈希密码中。您只需使用旧哈希对新密码进行哈希即可验证它是否为真。看看crypt()方法:php.net/manual/en/function.crypt.php
- @Dagon这可能是你的网站的游戏,但你仍然有责任(或者至少你应该)保护你的用户密码,因为他们可能正在使用这些密码进行其他服务。
- OT:这不是用户使用安全密码的责任(每个站点一个)不是我的责任吗?
- @达贡我同意访问数据库是游戏结束了,但正如维塔夫所说,必须尽可能地保护它。
- 然后加密所有内容以及密码散列。你想走多远?
- @UKjent i目前已经实现了crypt(),并使用salt作为固定的字符集,在不同的顺序中多次将用户名附加到末尾,这意味着输入用户名时可以重新创建salt。
- @Dagon用户应该在网上为他们的每个帐户设置单独的密码,但事实上,这种情况多久发生一次?!
- @Dagon您有责任尽可能保护您的用户数据。
- 我的"责任"仅限于我的网站服务条款和当地法律。也被称为"不信任任何人"
- @在这种情况下,请(为了每个人的利益)不要给其他人关于隐私和安全的建议。
- @如果这不是爱的夏天,我会告诉你你的建议可以做什么。
盐不用于加密。相反,它(与密码一起)进入一个哈希函数。这样,没有人(甚至你的应用程序)可以确定密码,但你可以验证密码。
然后,salt用于要求攻击者单独攻击每个密码散列(如果攻击者只需要一个密码,salt就没有任何帮助)。由于有了彩虹表,计算常用密码的哈希函数的输出相当容易。
salt值不是秘密的,可以安全地存储在MySQL数据库中(甚至发布)。
- 谢谢,读过这篇文章后会更有意义,但对于哈希和加密之间的区别却很困惑?
- 加密有一个解密算法,如果您知道密钥,它将撤消其工作。哈希应该是单向的。一旦你做了一个哈希,你就不能返回,但是当你输入相同的值时,它总是会给出相同的值。您在这里要做的是散列附加了salt的密码,存储看似随机的值,然后在检查用户是否键入了正确的密码时,使用相同的前一个salt散列该密码,并比较散列。如果攻击者得到散列,就很难让它向另一个方向去获得明文。
- @hackartist那么散列比加密好,因为它只走一条路?
- 我不一定说得更好,但更简单,可能对你更安全。如果加密,则要解密的密钥必须位于代码中的某个位置或服务器上的某个文件中。如果攻击者进来了,那么您的数据就完蛋了。如果散列,即使你不能分辨密码是什么,但你仍然可以验证它们是否正确。另一件事是散列的大小总是相同的,但加密可能会泄漏有关密码取决于加密方法的时间的信息。以这种方式使用哈希对于Web和密码来说是相当标准的。
- 那么,在屏蔽数据方面,哈希就足够了吗?(我决定去买SHA-512)。然后它只是保护数据库,这是一个全新的球场…叹息
- @Crazyloonyin散列是最佳实践。任何形式的加密(通常)都是无用的,因为它不会妨碍以任何方式控制您的应用程序的攻击者。
以你计划的方式储存盐是非常好的。事实上,允许攻击者看到盐是可以的。salt的目的是通过扩展消息空间的大小,防止人们使用预先构建的名为彩虹表的查找表。所有的salt功能都是让它们放弃任何预计算,并解决整个问题,这是耗时的,但肯定是可能的(尤其是对于MD5这样的哈希,您应该转到sha256)
您希望为每个用户使用不同的salt,这样攻击者就必须为他们恢复的每个密码做全部的工作,而不仅仅是基于一个salt生成一个新表。
SALT的目的是防止使用彩虹表,这将允许黑客为某些密码生成大量预先生成的哈希。通过在散列前将salt附加到密码,散列与原始密码完全不同。
1 2
| password => 5f4dcc3b5aa765d61d8327deb882cf99
password+saltvalue => 1d7dc54c316b11f3a38cc24fa68e2b6a |
因此,他们需要为每个不实用的salt值重新创建哈希。
你可以把盐看作是"半独特的",它实际上不必是额外的盐列。用户名、用户电子邮件也是一种盐。所以它们实际上存储在数据库中,靠近散列密码。当用户决定更改用户名或电子邮件时,这种方法会出现一个问题。
- 用户名和电子邮件不应被视为有效的salt,因为它们完全不是随机的。salt值必须是一个随机值才能真正使用。
- @安德鲁谁告诉你的?如果攻击者拥有您的数据库,那么电子邮件和salt在单独的列中作为随机字符串/int没有区别?salt应该防止彩虹表(不能简单地还原哈希)和暴力破解密码(未知因素太多)。请阅读这个问题的第一个答案(作者@phihag)-他详细解释了这个问题。让我们做一些测试-这是我的用户名"mrok",这是我的MD5密码哈希"954AD36392492CBDF416445A35C17D8"(跳过)-请找到我的纯文本密码-salt不是随机的。