harbor的加密机制与后台修改登录密码

   参考:https://github.com/mitsuhiko/python-pbkdf2/blob/master/pbkdf2.py

        很久没写博客,也是没时间写,因为平时工作忙,也没什么时间写博客,今天刚好抽点空,哈哈。

我们公司由于要做应用docker化,所以免不了要用harbor来存储docker镜像,比较方便。然而我们设想一下,如果哪天你的web登录密码忘了,而管理员的web登录密码也忘了,那该如何修改密码呢?

毫无疑问我们只能进harbor的后台mysql进行修改,但是查资料发现,这个harbor中的mysql的密码是采用pbkdf2算法,调用的Hash函数为Sha1,迭代4096次,密钥长度为int型16位得出的,所以你常规的用明文密码去update是不行的,必须要通过算法将密钥算出来,然后update可以成功。

下面是密钥计算算法,计算明文为123QWEqwe, 盐值为gktqer4zml32472wmht9xeuixvg5pvjd, 迭代次数为4096, 密钥长度int型16位

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import  hmac
import  hashlib
from  struct  import  Struct
from  operator  import  xor
from  itertools  import  izip, starmap
 
 
_pack_int  =  Struct( '>I' ).pack
def  pbkdf2_hex(data, salt, iterations = 4096 , keylen = 16 , hashfunc = None ):
     return  pbkdf2_bin(data, salt, iterations, keylen, hashfunc).encode( 'hex' )
def  pbkdf2_bin(data, salt, iterations = 4096 , keylen = 16 , hashfunc = None ):
     hashfunc  =  hashfunc  or  hashlib.sha1
     mac  =  hmac.new(data,  None , hashfunc)
     def  _pseudorandom(x, mac = mac):
         =  mac.copy()
         h.update(x)
         return  map ( ord , h.digest())
     buf  =  []
     for  block  in  xrange ( 1 - ( - keylen  / /  mac.digest_size)  +  1 ):
         rv  =  =  _pseudorandom(salt  +  _pack_int(block))
         for  in  xrange (iterations  -  1 ):
             =  _pseudorandom(''.join( map ( chr , u)))
             rv  =  starmap(xor, izip(rv, u))
         buf.extend(rv)
     return  ''.join( map ( chr , buf))[:keylen]
rv  =  pbkdf2_hex( '123QWEqwe' 'gktqer4zml32472wmht9xeuixvg5pvjd' 4096 16 )
print (rv)

计算出密钥值为65e900b5a2bdff474e29d0d2b21f4945


下面更新下数据库,修改用户名为testc的密码:update user set password='65e900b5a2bdff474e29d0d2b21f4945' where name='testc';

前台web登录账号:testc

前台web登录密码:123QWEqwe




再带上一个随机出salt值的代码:

#32位随机密码

from random import choice

import string

def Makepass(length=32, chars=string.letters+string.digits):

    return ''.join([choice(chars) for i in range(length)])

if __name__ == '__main__':

    for i in range(10):

        print Makepass()

本文转自飞奔的小GUI博客51CTO博客,原文链接http://blog.51cto.com/9237101/2057032如需转载请自行联系原作者


ziwenzhou

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值