硬编码的密码应该是盐渍/哈希吗?

时间:2012-05-21 16:48:56

标签: language-agnostic passwords

关于简单的无数据库登录系统,StackOverflow有很多问题。我想在a recent one上建议一个盐渍哈希方法,当时我想:“这样做真的有意义吗?”。

我多年来一直在数据库中存储盐渍哈希,我理解为什么它更安全:如果数据库被泄露,它包含的信息将不允许任何人登录我的系统(与我存储纯文本时不同)数据库中的密码。)

但是在不涉及数据库的设置中,哈希+ salting是否提供任何安全性好处?我能想到的唯一原因是,如果攻击者获得对我的服务器端代码的只读访问权限,则无法找出任何密码。这可能是一种情况吗?因为只要攻击者获得对文件的写访问权限,他就可以做任何事情。

所以我的问题是:在设置非常简单的无数据库登录系统时,密码应该被加盐/散列,还是只存储为纯文本?

3 个答案:

答案 0 :(得分:3)

是的,它仍然为哈希和盐提供了好处。如果脚本的源代码被泄露,则人们可以简单地使用硬编码密码或谷歌搜索哈希并可能找到输入值。使用盐渍哈希是不可能的。

答案 1 :(得分:2)

我认为,如果您能找到答案,“我的源代码是否明显不太可能被攻击者读取,而不是数据库?”,我会回答您的问题。

我认为它不是 - 也许你的来源不太可能泄漏,这取决于事情是如何备份的等等。即便如此我怀疑它泄漏的可能性更小,你可以忽略风险,给定你不要忽视数据库的相同风险。数据库中的密码应该被加盐/散列的原因并不是数据库的某些特殊属性意味着攻击者可以查看其内容[*],攻击者可以通过这种或那种方式查看各种事物。

事实上,源代码甚至可能比数据库泄漏更多,因为在系统上工作的任何人都可能需要访问源,而不是每个在系统上工作的人都需要访问实时DB的内容。并不是说我认为你的开发人员是不诚实的(如果他们是,你的问题比密码泄漏更糟),只是围绕共享源的物流可能会引入更多(或只是不同的)可能意外泄漏的方式,而不是围绕备份的后勤DB。

就个人而言,在您的情况下,我会在服务器上创建一个包含散列/加密密码的小文件,而不是其他任何内容。安装应用程序的不同实例的用户可以生成自己的此文件版本,包含自己的密码,与实际应用程序代码分开。他们应该使用与源代码相同的写访问限制来锁定它。

无论您将此文件称为“只读数据库”还是“服务器代码的一部分”都不会影响攻击者查看它的容易程度,尽管它可能会影响您是否将密码称为“硬编码”。

[*]当然存在特殊数据库,SQL注入攻击或其他任何特殊的潜在漏洞。那些是数据库中密码应该被加盐和散列的决定性原因。

答案 2 :(得分:1)

好吧,正如Steve Jessop已经概述的那样。源代码可能泄漏或更有可能在某些人手中。如果您对密码进行硬编码(我所知道的那样),那么为什么不将其存储为两部分的数据结构=>使用的盐和哈希密码。你知道,但它从未出现在源代码中。这也是人们对数据库连接字符串或类似操作的处理方式。使用位于其下方变量中的键对其进行加密。因此它在源代码中永远不会出现。除非只是越过,否则甚至可能不会在内存转储中。

相关问题