sza*_*gab 17 security postgresql perl
在用Perl编写并使用PostgreSQL的Web应用程序中,用户拥有用户名和密码.存储密码的推荐方法是什么?
使用crypt()
Perl函数和随机盐加密它们?这会将密码的有用长度限制为8个字符,并且需要获取存储的密码,以便与用户在进行身份验证时获取的密码进行比较(以获取附加到其上的盐).
PostgreSQL中有内置的方法可以做到这一点吗?
我应该使用Digest :: MD5吗?
von*_*rad 29
不要像大多数其他人建议的那样使用SHA1或SHA256.绝对不要使用MD5.
SHA1/256和MD5都设计用于创建文件和字符串的校验和(如有必要,还可以创建其他数据类型).因此,它们被设计为尽可能快,以便快速生成校验和.
这种快速的速度使得强制密码更加容易,因为编写良好的程序很容易每秒产生数千个哈希值.
相反,请使用专为密码设计的慢速算法.它们的设计需要花费更长的时间才能生成,其好处是暴力攻击变得更加困难.因此,密码将更加安全.
如果您只想一次加密一个密码,那么您将不会遇到任何重大的性能劣势,这是存储和检查密码的正常实现.它只是散装的真正区别.
我个人喜欢bcrypt.应该有一个可用的Perl版本,因为快速Google搜索产生了几个可能的匹配.
Dav*_*man 17
MD5是常用的,但SHA1/SHA256更好.仍然不是最好的,但更好.
所有这些通用哈希算法的问题在于它们被优化为快速.但是,当您对存储密码进行哈希处理时,快速就是您不想要的 - 如果您可以在一微秒内对密码进行哈希处理,那么这意味着攻击者可以每秒尝试一百万个密码你的密码数据库.
但你想尽可能减慢攻击者的速度,不是吗?使用需要十分之一秒的算法代替哈希密码不是更好吗?十分之一秒仍然足够快,用户通常不会注意到,但拥有数据库副本的攻击者每秒只能进行10次尝试 - 查找工作集需要花费100,000次登录凭据.每次尝试以微秒为单位的每小时变成11 年,每次尝试十分之一秒.
那么,你是如何做到这一点的?有些人通过运行几轮MD5/SHA消化来伪造它,但是bcrypt算法专门用于解决这个问题.我不完全理解它背后的数学,但我被告知它是基于Blowfish帧的创建,这本身就很慢(不像MD5操作,可以在正确配置的硬件上大量精简),并且它有一个可调节的"成本"参数,以便随着摩尔定律的发展,您需要做的就是调整"成本"以保持密码散列在十年内与现在一样慢.
使用 SHA1 或 SHA256 散列加盐。这就是存储密码的方法。
归档时间: |
|
查看次数: |
2798 次 |
最近记录: |