到目前为止,我们已经看到通过将密钥和消息连接在一起计算 MAC 所造成的危害。在此任务中,我们将改正这一错误。计算 MAC 的标准方法是使用 HMAC 。学生应该修改服务器程序的 verify_mac() 函数,并使用 Python 的 hmac 模块来计算MAC。该函数位于 lab.py 中。给定密钥和消息(均为字符串类型),计算 HMAC 如下所示:
mac = hmac.new(bytearray(key.encode('utf-8')),
msg=message.encode('utf-8', 'surrogateescape'),
digestmod=hashlib.sha256).hexdigest()
在使用 HMAC 进行 MAC 计算时,学生应重复任务 1 以发送列出文件的请求。假设选择的密钥是 123456 ,则可以通过以下方式计算 HMAC :
$ python3
Python 3.5.2
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information
>>> import hmac
>>> import hashlib
>>> key='123456'
>>> message='lstcmd=1'
>>> mac = hmac.new(bytearray(key.encode('utf-8')),
msg=message.encode('utf-8', 'surrogateescape'),
digestmod=hashlib.sha256).hexdigest()
学生应说明为什么当客户端和服务器使用 HMAC 时,使用长度扩展和附加命令的恶意请求将使 MAC 验证失败。