2017-08-11 90 views
2

我試圖創建將採取sha1哈希和更新500倍自身的函數,因此,例如:製作哈希摘要輪

>>> import hashlib 
>>> d = hashlib.sha1() 
>>> d.update("test") 
>>> d.hexdigest() 
'a94a8fe5ccb19ba61c4c0873d391e987982fbbd3' 
>>> e = hashlib.sha1() 
>>> e.update("a94a8fe5ccb19ba61c4c0873d391e987982fbbd3") 
>>> e.hexdigest() 
'c4033bff94b567a190e33faa551f411caef444f2' 
>>> 

我想要做的就是採取的哈希原始字符串test並將其重新哈希到另一個哈希,從給定的散列。

我有一些麻煩,這樣做:

def sha1_rounds(string, salt=None, front=False, back=False, rounds=500, **placeholder): 
    obj = hashlib.sha1() 
    if salt is not None and front and not back: 
     obj.update(salt + string) 
    elif salt is not None and back and not front: 
     obj.update(string + salt) 
    else: 
     obj.update(string) 
    for _ in range(rounds): 
     obj1 = obj.hexdigest() 
     obj = obj.update(obj1) 
    return obj.hexdigest() 

當這個代碼運行時,它給我下面的錯誤:

Traceback (most recent call last): 
    File "<pyshell#93>", line 1, in <module> 
    sha1_rounds("test") 
    File "<pyshell#92>", line 10, in sha1_rounds 
    obj1 = obj.hexdigest() 
AttributeError: 'NoneType' object has no attribute 'hexdigest' 

如果我正確理解這一點,這是什麼錯誤告訴我,當我試圖重新更新散列對象時,它會導致None。不過,我嘗試了一些不同的事情,但我並不完全確定如何才能成功完成此任務。我如何在給定散列的for循環中創建一個新的散列對象?

+0

我建議你升級到Python 3,所以你可以使用[hashlib.pbkdf2_hmac](https://docs.python.org/3 /library/hashlib.html#hashlib.pbkdf2_hmac) –

+0

@ PM2Ring它是一個散列破解框架,所以我試圖打破散列,不存儲它 – mawi

回答

1

我想通過創建一個新的散列對象並在回合之前對字符串進行十六進制的簡化,我可以通過將散列對象創建移動到for循環之外來加速性能。如果任何人有任何其他想法,我會很高興地看到他們:

def sha1_rounds(string, salt=None, front=False, back=False, rounds=500, **placeholder): 
    obj = hashlib.sha1() 
    if salt is not None and front and not back: 
     obj.update(salt + string) 
    elif salt is not None and back and not front: 
     obj.update(string + salt) 
    else: 
     obj.update(string) 
     hashed = obj.hexdigest() 
    for _ in range(rounds): 
     obj1 = hashlib.sha1() 
     obj1.update(hashed) 
     hashed = obj1.hexdigest() 
    return hashed