1. 程式人生 > >harbor的加密機制與後臺修改登錄密碼

harbor的加密機制與後臺修改登錄密碼

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位

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()


harbor的加密機制與後臺修改登錄密碼