我正在创建一个处理大量个人数据的服务,因此让密码简单地飞出来是不合适的。我一直在寻找任何可能的解决方案,引起我注意的是phpass。我在StackOverflow上通过here读到了它。
我知道有很多关于这个问题的问题,但我想澄清一点,phpass是一种存储密码的安全方式。我怀疑的原因是它不使用任何盐(至少似乎没有使用),这是我被告知的安全存储的关键。
我当前的方法只是一个sha512-hash,其中包含一个特定于用户的salt,以及另一个特定于站点的哈希。这是我的PHP代码片段:
hash_hmac('sha512', $password.$account_specific, $site_specific);
很高兴听到一些关于这个问题的专家意见。我为创建另一个已经并将永远被问及的主题的线程而道歉。提前谢谢。
修改
我也听说过哈希密码,比方说,1000次也是存储密码的好方法。这种散列方式只需要几秒钟(最大值),但打破散列密码会花费很长时间吗?
答案 0 :(得分:8)
在处理网络安全主题时,没有“真正的”安全方式来做事。网络安全本质上是一种猫捉老鼠的游戏;日常用户是老鼠,黑客是猫。 Web安全主要是被动的,这意味着只有在发生安全漏洞时才会考虑新的安全实现。因此,黑客通常比安全实施领先一步。
话虽如此,您可以采取一些措施来提高网站的安全性:
1)使用盐值。
我知道你已经这样做了,这是一个很好的做法。说使用盐使您的应用程序安全,这是错误的,因为它没有。它使得攻击变得更加困难,是的,但是如果你在数据库中存储salt值并且最终得到整个数据库被注入/转储,那么黑客就拥有了使用彩虹表所需的所有信息。使用特定于应用程序的盐是一种额外的安全措施,但同样,如果您的应用程序被黑客入侵并且获得/反编译了源代码,那么黑客就拥有了他们所需的一切。
2)使用SSL证书
确保数据在进入/来自应用程序所在的服务器时是加密的,这是防止数据包嗅探和会话侧面升级的好方法。
3)使用SHA2哈希
SHA2哈希值被广泛实现,并且比它们的前身SHA1安全多倍。
4)让您的数据库和应用程序驻留在不同的服务器上。
如果您的数据库位于单独的服务器上(或者至少某个地方具有单独的IP),那么您可以将对数据库的访问限制为给定的呼叫IP地址/端口。这样,您可以确保可以对您的数据库进行的唯一调用来自您的应用程序。
5)使用存储过程而不是动态创建查询。
如果您的应用程序中包含逐行构建SQL查询的代码,则攻击者可以使用此信息来映射数据库的结构,然后有效地注入它。如果你使用存储过程,那么这个逻辑将从源代码的角度抽象出来,攻击者通过查看它们就无法深入了解你的数据库结构。
6)检查所有可能的注射点
尝试破解自己的应用程序。你知道的最好,所以你应该知道它最薄弱的一点。虽然开发人员可能会在那里制作一些最差的QAers,但是确定是否可以打开可注射孔。您是否有使用用户输入来格式化查询的地方?如果是这样,请弄乱输入,看看你能做些什么。
根据我的经验,如果您完成上述所有操作,那么您将受到很好的保护。没有什么是100%安全的,但除非你持有十亿美元免费现金赠送方式的密码,否则这些障碍将阻止绝大多数黑客(如果不是全部的话)。在少数几家大公司的网站上工作,其中一些网站缺乏安全性是荒谬的(咳嗽 *咳嗽* SONY 咳嗽 *咳嗽*)。 / p>
请记住,许多用户喜欢在不同的平台上使用相同的密码。如果用户A为您的站点(一个安全的站点)和另一个站点(一个不安全且不散列密码的站点)使用相同的密码,那么攻击者只需要找到最薄弱的链接。用户的浏览习惯并从那里获得纯文本密码。
致以最诚挚的问候,
答案 1 :(得分:2)
重要的是要注意盐对于防止字典攻击或暴力攻击是无用的。
答案 2 :(得分: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参数)。 请注意,只有在数据库和代码都受到威胁时才需要额外的迭代。