Phpass是安全密码存储的最佳解决方案


phpass the best solution for secure password-storing?

我正在创建一个处理大量个人数据的服务,因此让密码简单地飞出来是不合适的。我一直在寻找任何可能的解决方案,其中一个引起我注意的是phpass。我确实在这里的StackOverflow上读到过。

我知道关于这个主题有很多问题,但我只想澄清一下,phpass是一种安全的存储密码的方式。我怀疑的原因是它不使用任何盐(至少似乎不使用),我被告知,这是安全存储的关键。

我当前的方法只是一个sha512哈希,其中包含一个特定于用户的盐和另一个特定于站点的哈希。下面是我的php代码片段:

hash_hmac('sha512', $password.$account_specific, $site_specific);
在这个问题上能听到一些专家的意见就太好了。我很抱歉为这个话题创建了另一个帖子,这个话题一直被问到,也将永远被问到。提前谢谢。 编辑:


我还听说,对密码进行1000次散列也是一种存储密码的好方法。这种方式哈希只需要几秒钟(最多),但破解哈希密码需要很长时间?

在处理网络安全问题时,没有"真正"安全的方法。网络安全本质上是一场猫捉老鼠的游戏;日常用户是老鼠,黑客是猫。Web安全主要是反应性的,这意味着只有在发生违反安全的情况下才会考虑新的安全实现。正因为如此,黑客通常比安全实现领先一步。

话虽如此,你可以做很多事情来让你的网站更安全:

1)使用盐值。

我知道你已经这样做了,这是很好的练习。说使用盐使应用程序安全是错误的,因为事实并非如此。是的,这使得黑客更难入侵,但是如果你在数据库中存储盐值,并且你最终将整个数据库注入/转储,那么黑客就拥有了使用彩虹表所需的所有信息。使用特定于应用程序的salt是一种额外的安全措施,但是,同样,如果您的应用程序被黑客攻击,并且源代码被获取/反编译,那么黑客就拥有了他们所需要的一切。

2)使用SSL证书

确保数据在进出应用程序所在的服务器时是加密的,这是防止数据包嗅探和会话侧劫持的好方法。

使用SHA2哈希

SHA2哈希值被广泛实现,并且比其前身SHA1安全许多倍。

4)让你的数据库和应用程序驻留在不同的服务器上。

如果你的数据库在一个单独的服务器上(或者至少有一个单独的IP),那么你可以限制对数据库的访问到一个给定的调用IP地址/端口。通过这样做,您可以确保对数据库的唯一调用来自您的应用程序。

5)使用存储过程,而不是动态创建查询。

如果您的应用程序中包含逐行结构化SQL查询的代码,那么攻击者可以使用此信息来绘制您的DB结构并随后有效地注入它。如果您使用存储过程,那么该逻辑将从源代码的角度抽象出来,攻击者无法通过查看它们来了解您的数据库结构。

检查所有可能的注射点

尝试破解自己的应用程序。你最了解它,所以你应该知道它的弱点。虽然开发者可能会做出一些最糟糕的qaer,但弄清楚你是否留下了一个可注入的漏洞应该是可能的。您是否在某些地方使用用户输入来格式化查询?如果是这样,请随意修改一下输入,看看能做些什么。

根据我的经验,如果你做到了以上所有的,那么你就得到了很好的保护。没有什么是100%安全的,但除非你持有数十亿美元免费现金的密码,否则这些障碍将阻止绝大多数黑客(如果不是全部的话)。我在一些大公司的网站上工作过,有些网站使用的缺乏安全性是荒谬的(咳嗽 *咳嗽* SONY 咳嗽 *咳嗽*)。

还要记住,许多用户喜欢在不同的平台上使用相同的密码。如果用户A对所有内容使用相同的密码并注册了您的网站(一个安全的),然后注册了另一个网站(一个不安全且不散列密码的网站),那么攻击者只需找到用户浏览习惯中最薄弱的环节并从中获得明文密码。

问好,

重要的是要注意,盐对于防止字典攻击或暴力破解攻击是无用的。

如何安全地存储密码

我使用这个:

function super_hash($string,$key,$times=2) {
    $hashed_string = SITE_KEY . $string . $key;
    for($i=1;$i<=$times;$i++) {
        $hashed_string = hash_hmac('sha512',$hashed_string,SITE_KEY . $key . 'hardcoded_key');
    }
    return $hashed_string;
}

要获得更高的安全性(更慢的处理),只需添加更多的迭代($times参数)。请注意,只有当您的数据库和代码都被破坏时,才需要额外的迭代。