我今天想向您介绍的一种加密算法称为bcrypt。BCRYPT是由Niels Provos和DavidMazières设计的密码哈希功能。他基于Blowfish密码,并于1999年在Usenix上提议。
除了添加盐以抵抗彩虹桌攻击外,BCRypt的一个非常重要的特征是适应性,它可以确保加密的速度在特定范围内。,慢慢加密速度,可以抵抗暴力搜索攻击。
BCRYPT函数是OpenBSD和其他系统,包括某些Linux发行版的默认密码哈希算法(例如Suse Linux)。
让我们首先回顾一下Blowfish的加密原理。首先需要生成K数组和S-box,用于加密的Blowfish和Blowfish,这需要一定时间来生成最终的K数组和S-Box。每个新密钥都需要准备大约4 kb text.com,并用其他分组密码算法做好准备,这将非常慢,但是一旦生成,或者键常数,池塘仍然是一种快速的加密方法。
那么慢吗?
当然,因为对于普通应用程序,将不会经常更换密钥。因此,预处理只会生成一次。稍后使用时,它会很快。
对于恶意攻击者,每次尝试一个新钥匙时,都需要执行长时间的准备处理,因此攻击者破解Blowfish算法并不是成本效益。
Provos和Mazières使用了这一点,并进一步开发了它。它们为Blowfish开发了一种新的密钥设置算法,该算法称为“ Eksblowfish”(“昂贵的密钥计划Blowfish”)。这是对Blowfish的改进算法。在BCRYPT的最初关键设置中,使用盐和密码来设置子键。然后在一轮标准的池塘算法之后,使用盐和密码作为钥匙,每轮依赖于上一轮键的状态。尽管从理论上讲,BCRYPT算法的强度不比池塘好,而是因为可以配置重置BCRPYT中的钥匙的车轮数量,因此可以通过增加车轮数量来更好地抵抗暴力攻击。
简而言之,bcrypt算法是字符串OrpheanbeholdersCryDoubt上64个Blowfish加密的结果。某些朋友会问,BCRypt是否使用BCRypt来加密密码?如何加密字符串?
不用担心,bcrpyt是加密密码作为字符串的因素,该因素也具有加密的效果。let,请参见BCRypt的基本算法实现:
上述函数BCRYPT具有3个输入和1个输出。
在输入部分中,成本代表轮横梁的次数。我们可以自己指定。
盐是加密的盐,使密码混淆。
密码是我们要加密的密码。
最终输出是哈希的加密结果。
使用3个输入,我们将调用EksblowFishSetup函数以初始化18个子键和4个1K S-box,以实现最终的P和S。
然后使用P和S在“ OrpheanbeholdersCryDoubt”上执行64个洪水操作,并最终获得结果。
接下来,查看EksblowFishSetup方法的算法实现:
代码非常简单。EksblowFishSetup接收上述3个参数,以18个子pyes返回最终P和4 1K Sbox。
首先初始化,获取初始P和S。
然后致电ExpandKey,输入盐和密码,并生成P和S的第一轮。
然后循环2个成本时间,轮流使用密码和盐作为生成P和S的参数,最后返回。
最终查看ExpanyKey的实施:
ExpandKey主要用于生成P和S。算法的产生相对复杂。如果您有兴趣,可以详细研究它。
我们可以使用bcrypt来加密密码。最后,它以bcrypt哈希的形式保存到系统中。bcrypt哈希的格式如下:
例如:
在上面的示例中,哈希算法的独特符号是bcrypt算法。
10代表成本系数,即2的第10侧,即1024轮。
N9QO8uloICKX2ZMRZOMYE是16个字节(128bits)获得的22个长度。
最后一个IJZAGCFL7P92LDGXAD68LJZDL17LHWY是24字节(192BITS)。由Bash64获得的31个长度字符已编码。
此哈希格式遵循OpenBSD密码文件中使用的模块化密码格式格式。开始时,格式定义如下:
但是,最初的规格并未定义如何处理非ASCII字符,也没有定义如何处理NULL终止符号。修订后的规格规定了hash string时:
由于这些更改,BCRYPT的版本数量已修改。
但是,在2011年6月,由于PHP对bcypt_blowfish在错误中的bug的实现,他们建议系统管理员更新其存在。到crypt_blowfish。
然后在2014年2月,在OpenBSD的BCrypt实现中也发现了一个错误,该实现将字符串的长度存储在非symbol char中(即8- bit Byte)。如果密码的长度超过255个字符,则将溢出。
由于BCRypt是为OpenBSD创建的。因此,当错误出现在其库中时,他们决定将版本编号升级到。
最受欢迎的解释,最深的干货,最简单的教程,您不知道的许多技巧正在等待您发现!
欢迎注意我的公共帐户:“程序的事情”,了解技术并更好地了解您!