# 挑战三十一:实现并破解带有人工时序泄露的HMAC-SHA1 ## 题目描述 Wikipedia上的伪代码应该就足够了。HMAC非常简单。 使用你选择的Web框架(Sinatra、web.py等),编写一个小应用程序,它有一个URL,接受"file"参数和"signature"参数,如下所示: ``` http://localhost:9000/test?file=foo&signature=46b4ec586117154dacd49d664e5d63fdc88efb51 ``` 让服务器生成HMAC密钥,然后验证传入请求的"signature"对"file"是否有效,使用"=="运算符比较文件的有效MAC与"signature"参数(换句话说,按任何普通程序员验证HMAC的方式验证它)。 ## 实现要求 编写一个函数,称之为"insecure_compare",通过逐字节比较和早期退出来实现==操作(即,在第一个不匹配的字节处返回false)。 在"insecure_compare"的循环中,添加50ms睡眠(每个字节后睡眠50ms)。 使用你的"insecure_compare"函数验证传入请求的HMAC,并测试整个装置是否工作。如果MAC无效则返回500,如果正常则返回200。 ## 攻击任务 使用此应用程序中的时序泄露,编写一个程序来发现任何文件的有效MAC。 ## 为什么使用人工延迟? **为什么是人工延迟?** 早期退出字符串比较可能是密码学时序泄露最常见的来源,但它们并不特别容易利用。事实上,许多时序泄露(例如,C、C++、Ruby或Python中的任何泄露)可能根本无法在广域网上利用。要玩攻击现实世界的时序泄露,你必须开始编写低级时序代码。我们在这些挑战中保持密码学性。