9

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

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

我当前的方法只是一个 sha512-hash,带有一个用户特定的盐和另一个特定于站点的哈希。这是我的 PHP 代码的剪辑:

hash_hmac('sha512', $password.$account_specific, $site_specific);

很高兴听到一些关于这个问题的专家意见。我很抱歉为这个已经并将永远被问到的主题创建了另一个线程。提前致谢。

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

4

3 回答 3

8

在处理 Web 上的安全主题时,没有“真正的”安全方式来做事。网络安全本质上是一场猫捉老鼠的游戏。日常用户是老鼠,黑客是猫。Web 安全主要是被动的,这意味着只有在发生安全漏洞时才会考虑新的安全实施。因此,黑客通常比安全实施领先一步。

话虽这么说,您可以做很多事情来使您的网站更安全:

1) 使用盐值。

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

2) 使用 SSL 证书

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

3) 使用 SHA2 哈希

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

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

如果您将数据库放在单独的服务器上(或至少在具有单独 IP 的地方),那么您可以将对数据库的访问限制为给定的调用 IP 地址/端口。在这样做时,您可以确保可以对您的数据库进行的唯一调用来自您的应用程序。

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

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

6) 检查所有可能的注入点

尝试破解您自己的应用程序。你最了解它,所以你应该知道它的弱点。虽然开发人员可能会制造一些最糟糕的 QAer,但应该可以弄清楚你是否留下了一个可注射的洞。您是否在任何地方使用用户输入来格式化查询?如果是这样,请弄乱输入,看看你能做什么。

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

还要记住,很多用户喜欢在不同的平台上使用相同的密码。如果用户 A 对所有内容都使用相同的密码并注册您的站点(一个安全的),然后注册另一个站点(一个不安全且不散列密码的站点),那么攻击者只需找到最薄弱的链接用户的浏览习惯并从那里获取纯文本密码。

此致,

于 2011-07-12T20:26:36.823 回答
2

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

如何安全地存储密码

于 2011-07-12T18:10:49.483 回答
0

我用这个:

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 参数)。请注意,仅当您的数据库和代码都受到损害时才需要额外的迭代。

于 2011-07-12T20:28:48.503 回答