密码安全;这个安全吗?

3

昨天我问了一个关于密码安全的问题...

我对安全方面还很陌生...

我正在使用mysql数据库,需要在其中存储用户密码。在回答中,有人告诉我用哈希方法来保存密码的哈希值,这是正确的做法。

所以,基本上我想确认一下这现在是否正确。

这是一个分类广告网站,每个用户发布广告时都需要输入密码,以便他/她以后可以使用该密码删除分类广告(例如当产品被售出时)。

在名为“put_ad.php”的文件中,我使用$_POST方法从表单中获取密码。然后我将其哈希化并放入mysql表中。然后每当用户想要删除广告时,我通过哈希它并比较输入密码的哈希值与mysql数据库中的哈希值来检查输入的密码是否正确,对吗?

但是,如果我作为管理员想删除一个分类广告,是否有易于“反哈希”密码的方法?

目前使用的是sha1。

非常感谢提供一些代码。

谢谢


2
关于从页面传递的变量的问题,您的评论应该是可以的,但您可能需要考虑通过SSL提供此页面。 - Paddy
2
单独使用哈希是不够的-您还必须使用盐。请阅读Arkh的答案。 - Michael Borgwardt
我也会对密码进行加盐处理。 - Grzegorz Gierlik
8个回答

6
如果您是管理者并且已经编写代码,则无需知道原始用户密码。作为管理员,您在代码中有权这样做。正确进行操作。
这就是用户认证和用户授权之间的区别。

好的,但是密码是在 "put_ad.php" 文件中这样获取的:$pass = $ _POST ['password']; 那么这样可以吗,因为实际密码将在此变量中直到哈希为止...还是我应该以其他方式处理? - user188962
这应该没问题。如果你想要更安全,可以在加密时调用 $_POST['password'](假设你没有以其他方式处理它(例如加盐))。但说实话,无论哪种方式都应该没问题。 - Harsha Kuchampudi

3

您所做的是正确的,但是SHA、MD5等哈希算法只能进行单向计算,无法逆向还原(理论上可以通过暴力破解)。作为管理员,您也应该拥有删除权限,这应该是授权管理的一部分。


好的,但密码是在"put_ad.php"文件中像这样获取的:$pass = $_POST['password']; 那么这样可以吗,因为实际密码将一直存在此变量中,直到进行哈希处理...或者我应该以其他方式处理? - user188962
3
你永远不可能对一个未加密的东西进行暴力破解,只能找到一个与原来相同的字符串,使其被摘要为相同的hash。 - alex
1
@alex:对于密码来说,攻击输入空间要容易得多,而且很可能会得到原始密码。 - Michael Borgwardt
@Camran:根据你目前的做法,需要将数据以明文形式传输到某个地方。首先应该更加关注实际传输的安全性,可以使用 SSL 进行加密保护。 - Daff
好的,明白了... 最后,你认为我的MySql varchar字段应该有多长呢?长度为100就足够了吧? - user188962
@Camran -- 这取决于您对安全性的重视程度。提高安全性的两个基本方法是在客户端上使用安全连接哈希密码 - Grzegorz Gierlik

2

是的,你对第一部分的理解是正确的。

然而,(轻易地)无法反向哈希密码。这实际上就是将哈希值存储而非真正密码的全部意义所在。

你应该考虑在你的 PHP 应用程序中加入一些逻辑,以便当一个拥有管理员权限的用户登录时,没有必要检查密码来删除条目。


1

对于每个密码,生成一个随机数(nonce)。使用nonce散列密码,并存储散列和nonce。这样做是无效的:如果他们窃取了您的数据库,他们将窃取md5和nonce,因此这是毫无意义的。 - o0'.
1
如果我得到一个充满sha1哈希密码的数据库,我可以在几个小时内生成1个彩虹表,然后快速获取简单密码。现在,如果我得到一个充满哈希和盐值密码的数据库,并且每个哈希都是唯一的,我需要为每个密码生成1个彩虹表。如果散列算法是具有良好参数的bcrypt,则每个生成可能需要很长时间。因此,即使有哈希,您最好使用字典攻击/暴力破解。bcrypt有助于抵御这种攻击,因为每次尝试需要超过微秒。 - Arkh
但在这种情况下,使用随机nonce或仅使用用户ID并没有任何区别:攻击者仍然必须暴力破解每个密码。 - o0'.
你说得有道理。但通常用户ID是自增的整数,它们并不是"big"。 - Arkh
是的,不过使用大或小的数字都没有任何区别:哈希值无论如何都会完全不同,而且彩虹表也会失败 ;) - o0'.
在本文的这一部分,他们仍然没有使用bcrypt。因此,在简单地加盐的上下文中,例如1234admin的哈希值可以很容易地包含在彩虹表中。在这种情况下,大型随机盐有助于使您的不良密码超出彩虹表的范围。我认为bcrypt比字符串连接要好得多,所以您可以使用简单的ID。 - Arkh

1

是的,你正在正确地存储密码。但正如Arkh所建议的那样,bcrypt是一种更安全的加密算法。

但密码是在服务器上加密的,这意味着它将以明文形式通过互联网发送,除非您使用SSL加密连接。任何在您和用户之间的线路上嗅探的人理论上都可以读取密码。对于您的用途,这可能是可以接受的...

我宁愿构建一个管理员界面,允许管理员用户删除他/她想要的任何分类,从而消除了“取消哈希”密码的需要。


0

不,没有办法“逆向”密码的哈希。哈希是一个单向过程,无法被逆转。

获得哈希码的可行密码唯一方式是使用暴力破解方法,尝试哈希不同的密码直到找到匹配项。

对于管理员来说,能够登录保密文件最简单的方式就是将当前哈希码存储起来,并从临时密码生成一个新的哈希码。然后他只需恢复原始哈希码,旧的密码便可正常使用。


0

是的,你说得对,但用户的密码不应该再可读,即使是管理员也不行!所以即使可以解密(实际上不行),将其解密回可读的明文也是绝对不允许的!

另一个问题是,你不应该只创建密码的哈希值,因为这是不安全的。密码可能会被暴力破解,也就是说,有人会遍历可能的密码并尝试创建从网络中嗅探到的哈希代码。如果他创建了相同的哈希值,他就找到了密码。 但是你可以使用加盐哈希。这意味着你将一些附加字符串(攻击者不知道的)添加到密码中,然后对其进行哈希。例如,你可以创建“用户名-我们应用程序已知的任何文本-密码”之类的哈希值。


0
如果问题是“如何解密密码”,答案是——没有解密哈希值的解决方案,一种方法是通过暴力破解(通过计算散列并将其与基数进行比较来找到原始值),但这是一个非常缓慢的过程。如果密码很“强”,那么这是不可解决的任务。
如果问题是“如何管理密码”——您不需要使用“解密”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接