찾다

 >  Q&A  >  본문

Python hashlib 为何同一字符常数输出Hash不同?

在做网络安全相关的设计,用到Python hashlib。

Python代码如下:

import datetime
import random
import hashlib

apikey = 'allankliu'
salt = 'abcdefg'
m = hashlib.md5()
rand = random.randint(0,65535)

for i in range(100):
    m.update('constant')
    print m.hexdigest()

发现只要使用m.update(string)方法后,每次打印的摘要都是不一样的。

11ac8edba2acc86348896c2f0f63a734
eb5d9f0db3d71555f3de11b1f5d20aaa
4e49fbbfdb17ecb08a1304b592d34148
5b0dec79c8a2155b0f27bf2cecc8adcc
3eb107bcf513ee333773eb4541e80d68
dc2e3a4e15dc5693bfaaa4ef1beaa564
fe8a08aa5e09181e8ed25a3c0a0b5c4d
c601302c932e72eb7ca9103a354eca2b
dd2aae804b473d330c039638d46ae5ce
4b644433898f64286f94cb165c5f3ae6
30e0a7d8659862a02f3da3d3da52b257
32a8c8c9dfd940ad748b4035aac04b72
b5fcfa5d5d90e8606c32787ef6d0205b
c5a58a8f0ca444bb496a391b24170776

我原来理解是只要输入字符是一样的,输出Hash就应该一样。难道update()方法还会重新初始化?

粗粗看过hashlib.py源码,有些看不懂,找不到MD5的构造方法,不知为何引用到OpenSSL之类的。

天蓬老师天蓬老师2805일 전879

모든 응답(2)나는 대답할 것이다

  • PHP中文网

    PHP中文网2017-04-17 17:14:24

    m.update(a); m.update(b)는 m.update(a+b)와 동일합니다

    hashlib 문서에서 발췌.

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-17 17:14:24

    allankliu 님의 답변이 맞습니다. 한 가지 추가 사항: 이 디자인의 목적은 빅 데이터 평가를 해결하고 데이터를 작은 조각으로 나누는 것입니다(또는 데이터가 네트워크에서 온다고 생각하고 update를 호출하여 데이터의 각 부분) update을 여러 번 호출하여 최종 해시 값을 계산합니다.

    회신하다
    0
  • 취소회신하다