2014-10-29 369 views
1

我已經打開一個文件,查找任何有HASH("<stuff>")HASH(<sha1(stuff)>)得到相同的SHA1哈希值與所有字符串

替代它的腳本的全部腳本是這樣的:

import sys 
import re 
import hashlib 

def _hash(seq, trim_bits=64): 
    assert trim_bits % 8 == 0 
    temp = hashlib.sha1(seq).hexdigest() 
    temp = int(temp, 16) & eval('0x{}'.format('F' * (trim_bits/4))) 
    temp = hex(temp) 
    return str(temp[2:]).replace('L', '') 

if __name__ == '__main__': 
    assert len(sys.argv) == 3 
    in_file = sys.argv[1] 
    out_file = sys.argv[2] 
    with open(in_file, 'r') as f: 
     lines = f.readlines() 
     out_handle = open(out_file, 'w') 
     for line in lines: 
      new_line = re.sub(r'HASH\((["\'])(.*?)\1\)', 'HASH({})'.format(_hash(r'\2')), line) 
      out_handle.write(new_line) 
     out_handle.close() 

然而,當我運行這個時,所有的sha1哈希變得完全一樣,這對我來說沒有意義。如果不是寫散列,我用HASH({}).format(r'\2')來切換它,它會用雙引號之間的字符序列替換它。那麼爲什麼sha1散列返回相同的字符串呢?

+0

看起來你會調用總是返回相同值的_hash(r'\ 2')'。 (http://blog.codinghorror.com/regular-expressions-now-you-have-two-problems/) – quamrana 2014-10-29 14:23:18

回答

2

您正在計算字符串r'\2'的散列值; re模塊只會在您將替換字符串用作替換字符串時替換該佔位符,但您在此處未這麼做。

通行證從匹配對象的組代替,使用替換功能:

def replace_with_hash(match): 
    return 'HASH({})'.format(_hash(match.group(2))) 

new_line = re.sub(r'HASH\((["\'])(.*?)\1\)', replace_with_hash, line) 

replace_with_hash()函數傳遞匹配對象,並且其返回值被用作替換。現在你可以計算第二組的哈希了!

演示:

>>> import re 
>>> def _hash(string): 
...  return 'HASHED: {}'.format(string[::-1]) 
... 
>>> sample = '''\ 
... HASH("<stuff>") 
... ''' 
>>> re.sub(r'HASH\((["\'])(.*?)\1\)', 'HASH({})'.format(_hash(r'\2')), sample) 
'HASH(HASHED: 2\\)\n' 
>>> def replace_with_hash(match): 
...  return 'HASH({})'.format(_hash(match.group(2))) 
... 
>>> re.sub(r'HASH\((["\'])(.*?)\1\)', replace_with_hash, sample) 
'HASH(HASHED: >ffuts<)\n' 

_hash()功能簡單地反轉輸入字符串顯示會發生什麼。

第一個re.sub()是你的版本;注意它是如何返回的'2\\',所以r'\2'顛倒了!我的版本整齊地哈希<stuff>>futts<

+0

我不知道它只替換了一個值的佔位符,如果它是替換字符串。真棒演示和解釋!謝謝! – ZWiki 2014-10-29 14:34:05

+0

只是巧合,對不起:/ – ZWiki 2014-10-29 14:44:12