参考: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):
h
=
mac.copy()
h.update(x)
return
map
(
ord
, h.digest())
buf
=
[]
for
block
in
xrange
(
1
,
-
(
-
keylen
/
/
mac.digest_size)
+
1
):
rv
=
u
=
_pseudorandom(salt
+
_pack_int(block))
for
i
in
xrange
(iterations
-
1
):
u
=
_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