Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 在数据库中加密用户密码的推荐方法是什么?_Perl_Security_Postgresql - Fatal编程技术网

Perl 在数据库中加密用户密码的推荐方法是什么?

Perl 在数据库中加密用户密码的推荐方法是什么?,perl,security,postgresql,Perl,Security,Postgresql,在用Perl编写并使用PostgreSQL的web应用程序中,用户拥有用户名和密码。存储密码的建议方法是什么 使用Perl的crypt()函数和随机salt加密它们?这会将密码的有效长度限制为8个字符,并且需要获取存储的密码,以便与用户在进行身份验证时给出的密码进行比较(获取附加到密码上的salt) PostgreSQL中有内置的方法来实现这一点吗 我应该使用吗?使用SHA1或SHA256哈希加盐。这是存储密码的方法。我建议将其存储为腌制md5哈希 INSERT INTO user (passw

在用Perl编写并使用PostgreSQL的web应用程序中,用户拥有用户名和密码。存储密码的建议方法是什么

使用Perl的
crypt()
函数和随机salt加密它们?这会将密码的有效长度限制为8个字符,并且需要获取存储的密码,以便与用户在进行身份验证时给出的密码进行比较(获取附加到密码上的salt)

PostgreSQL中有内置的方法来实现这一点吗


我应该使用吗?

使用SHA1或SHA256哈希加盐。这是存储密码的方法。

我建议将其存储为腌制md5哈希

INSERT INTO user (password) VALUES (md5('some_salt'||'the_password'));
如果愿意,可以用perl计算md5散列,除非进行微优化,否则不会有太大差别

您也可以使用sha1作为替代方案,但我不确定Postgres是否有这方面的本机实现

我通常不鼓励使用动态随机salt,因为它是另一个必须存储在数据库中的字段。另外,如果你的桌子被破坏了,盐就没用了

我总是使用一次性随机生成的salt,并将其存储在应用程序源或配置文件中


使用md5或sha1散列作为密码的另一个好处是,可以将密码列分别定义为md5和sha1的固定宽度字符(32)或字符(40)。

如果不使用密码恢复机制(而不是密码重置),我认为使用散列机制比尝试加密密码要好。您可以只检查哈希值,而不存在任何安全风险。即使您不知道用户的密码。

PostgreSQL中的pgcrypto模块内置了密码散列支持,这在存储、生成、多算法等方面非常智能。请参阅关于密码散列函数的部分。您还可以看到的pgcrypto部分。

MD5是常用的,但SHA1/SHA256更好。仍然不是最好的,但更好

所有这些通用散列算法的问题在于,它们都经过了优化,速度更快。但是,当您对密码进行散列存储时,fast正是您不想要的—如果您可以在一微秒内对密码进行散列,那么这意味着如果攻击者获得您的密码数据库,他们可以每秒尝试一百万个密码

但你想让攻击者尽可能慢下来,不是吗?使用一种只需十分之一秒的算法来散列密码不是更好吗?十分之一秒的速度仍然足够快,用户通常不会注意到,但是拥有数据库副本的攻击者每秒只能进行10次尝试-他们需要花费100000倍的时间才能找到登录凭据的工作集。他们每次尝试一微秒所需的每一小时,以每次尝试十分之一秒的速度变成11年


那么,你是如何做到这一点的呢?有些人通过运行几轮MD5/SHA消化来伪造它,但是bcrypt算法是专门为解决这个问题而设计的。我不完全理解它背后的数学原理,但有人告诉我它是基于Blowfish帧的创建的,它天生就很慢(与MD5操作不同,MD5操作可以在适当配置的硬件上进行大量简化),并且它有一个可调的“成本”参数,因此,随着摩尔定律的发展,你所需要做的就是调整“成本”要让你的密码哈希在十年内保持现在的速度。

不要像大多数人建议的那样使用SHA1或SHA256绝对不要使用MD5

SHA1/256和MD5都设计用于创建文件和字符串(以及其他数据类型,如果需要)的校验和。正因为如此,它们被设计得尽可能快,所以校验和可以快速生成

这种快速的速度使得暴力破解密码变得更加容易,因为一个编写良好的程序很容易每秒生成数千个哈希

相反,使用专门为密码设计的慢速算法。它们被设计为需要更长的时间来生成,其好处是暴力攻击变得更加困难。因此,密码将更加安全

如果一次只加密一个密码(这是存储和检查密码的正常实现),则不会遇到任何显著的性能缺点。真正不同的是,它只是批量生产


我个人喜欢bcrypt。它应该有一个Perl版本,因为快速的Google搜索产生了几个可能的匹配项。

我最喜欢bcrypt,SHA2(256)紧随其后。我从未见过MD5用于密码,但可能有些应用程序/库使用它。记住,你也应该经常用盐。盐本身对于每个用户都应该是完全独特的,而且在我看来,应该尽可能长。我永远不会,永远不会在没有盐的情况下对字符串使用哈希。主要是因为我有点偏执,也就是说这更能证明未来


在用户重试和自动锁定(带有自动管理员通知)之前进行延迟也是一个好主意。

MD5被认为是不安全的。应该使用SHA1或SHA256,我也读过这些博客帖子。对于90%(任意)的用例,md5已经足够了。@Henri:是的,但没有任何证据表明他的安全性、存储或计算能力需求。作为一个非本地postgres用户,我只是浏览了一下手册,发现它有一个本地md5,但没有sha1,因此我推荐它。我同意,我的建议值得这些评论,但投反对票?嗯,似乎有点多。MD5可能已经坏了,但这次攻击(王晓云和余洪波)并没有解决腌制的MD5案件。它假定完全自由地进行p