harbor的加密機制與後臺修改登錄密碼
很久沒寫博客,也是沒時間寫,因為平時工作忙,也沒什麽時間寫博客,今天剛好抽點空,哈哈。
我們公司由於要做應用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的加密機制與後臺修改登錄密碼