bcrypt加密算法

前言


我在公司内部做了一个“接口管理系统”(DRIM),这个系统的用户认证需要与公司已有的代码管理平台gitlab保持一致,采用的方式是DRIM直接读gitlab的数据库来做认证,所以需要知道gitlab是如何对密码做加密的。

过程


1.寻找数据库


这个过程很简单,很快就找到了其users表,里面有 encrypted_password一列,用来展示密码加密后的字符串。

2.寻找加密算法


虽然已经找到了密文的字符串,但ta并不是一般的sha1/md5之流,所以在gitlabhq@github上狂找,狂搜代码,妄想着能找到诸如user.login($username, $userpasswd)的函数实现,但一个都小时毫无收获。


后来google到一个网页说的是devise用什么加密算法,devise我在源码里见过很多次,而且其一定是跟认证有关的。遂继续看devise,原来ta是RoR的一个用户认证组件,很容易集成到RoR应用中,来相当完美+简单得解决用户认证(对每个系统而言,用户认证的流程基本一样,这也是devise作为独立组件的意义)。


devise组件默认使用bcrypt作为加密算法,也支持sha512、md5这种简单的摘要算法。gitlab就使用默认的bcrypt作为密码的加密算法。

关于bcrypt算法


之前没用过这个东东,遂继续google,发现在RoR中用的很多(得益于devise组件),在其他类型的开发框架中貌似不多,google到的结果很少。先大概了解了下ta的使用:


  • 通过salt和cost这两个值来减缓加密过程,ta的加密时间(百ms级)远远超过md5(大概1ms左右);

  • cost值我也没太理解,我暂时把ta当作是迭代次数;RoR的devise组件默认的cost是10,但其实推荐的值是12;

  • bcrypt是单向的,而且经过salt和cost的处理,使其受rainbow攻击破解的概率大大降低,同时破解的难度也提升不少;

  • bcrypt加密后的字符串形如:$2a$10$asdjflkaydgigadfahgl.asdfaoygoqhgasldhf,其中:$是分割符,无意义;2a是bcrypt加密版本号;10是cost的值;而后的前22位是salt值;再然后的字符串就是密码的密文了;

bcrypt的python库


我不用RoR(所以才导致找了半天devise是什么),平时用python比较多,DRIM系统也是python开发的。所以在python中使用bcrypt找了些资料。

python的这个包就叫 bcrypt,安装方法:pip install bcrypt;


demo代码如下:

 import bcrypt

password = b"yourpassword"
 # 对password做10轮的加密,获得了加密之后的字符串hashed,形如:$2a$10$aoiufioadsifuaisodfuiaosdifasdf
hashed = bcrypt.hashpw(password, bcrypt.gensalt(10))
# 检查用户输入的password是否正确,其实bcrypt.hashpw()函数的第二个参数是salt,bcrypt自己来解析版本、cost和前22位的salt,所以这里可以把整个hash过的字符串传进去
if bcrypt.hashpw(password, hashed) == hashed:
     print("It Matches!")
else:
     print("It Does not Match :(")


这个算法好,更安全,在对性能要求不是特别高的场合可以使用,以后我准备好好用ta了!^_^






你可能感兴趣的:(算法,Web开发,Python)