密码散列中的漏洞
vulnerabilities in password hashing
附加的Python代码接收输入字符串(例如,用户的密码)的散列函数,并使用MD5.What漏洞生成156位散列,使密码散列不合适可能存在在这段代码中。
#
from Crypto.Hash import MD5
import binascii
def hash(msg):
# pad message to 16 bytes
if len(msg) < 16:
msg = msg + (16 - len(msg)) * 'A'
# pick first 16 bytes
msg = msg[:16]
# converts message to upper case
msg = msg.upper()
# create MD5 objects
h1 = MD5.new()
h2 = MD5.new()
# hash two parts of message separately
h1.update(msg[:8])
h2.update(msg[8:16])
# concatenate the two hashes
h = h1.digest() + h2.digest()
return h
# print message
print(binascii.hexlify(hash("Hello, this is a great passphrase, and I am
wondering if anyone can crack it")))
Windows 中有一个名为 LM (LAN Manager) 的密码处理协议,它与我们在这里看到的有类似的缺陷。我有点想解决一个你应该自己做的测验问题......但既然我喜欢它,谁在乎呢。
从顶部开始:
- 填充可以。
- 选择前16个字节是不行的。你永远不应该减少熵。
- 一刀两断不行。暴力破解 8 个字符比暴力破解 16 个字符容易得多。
- 大写不行。再次减少熵。
- MD5 不再适用于加密目的。
我想就是这样了。
附加的Python代码接收输入字符串(例如,用户的密码)的散列函数,并使用MD5.What漏洞生成156位散列,使密码散列不合适可能存在在这段代码中。
#
from Crypto.Hash import MD5
import binascii
def hash(msg):
# pad message to 16 bytes
if len(msg) < 16:
msg = msg + (16 - len(msg)) * 'A'
# pick first 16 bytes
msg = msg[:16]
# converts message to upper case
msg = msg.upper()
# create MD5 objects
h1 = MD5.new()
h2 = MD5.new()
# hash two parts of message separately
h1.update(msg[:8])
h2.update(msg[8:16])
# concatenate the two hashes
h = h1.digest() + h2.digest()
return h
# print message
print(binascii.hexlify(hash("Hello, this is a great passphrase, and I am
wondering if anyone can crack it")))
Windows 中有一个名为 LM (LAN Manager) 的密码处理协议,它与我们在这里看到的有类似的缺陷。我有点想解决一个你应该自己做的测验问题......但既然我喜欢它,谁在乎呢。
从顶部开始:
- 填充可以。
- 选择前16个字节是不行的。你永远不应该减少熵。
- 一刀两断不行。暴力破解 8 个字符比暴力破解 16 个字符容易得多。
- 大写不行。再次减少熵。
- MD5 不再适用于加密目的。
我想就是这样了。