为什么nodejs / cookie中的cookie签名使用sha1-hashing来比较签名?

我只是看着执行cryptograhic签名扩展的快递,允许创build签名的cookie。

签名函数中的mac按照此处所述进行计算:

  1. 创build一个SHA256的实例
  2. 散列数据值
  3. 创build一个base64编码的摘要
  4. 删除结尾的相等字符('=')

结果是原始值和计算出的mac的连接。

在validation签名时,值再次被签名。 但是,然后不对签名进行相等testing,但是比较由原始值和附加的mac组成的整个string:

return sha1(mac) == sha1(val) ? str : false; 

这里“mac”包含原来的值与一个新计算的mac连接,“val”包含传递给validation方法的inputstring(包含与原mac连接的原始值),“str”是有符号值本身。

请参阅: https : //github.com/tj/node-cookie-signature/blob/master/index.js

我本来预料只有苹果机才会被比较。 但这种情况并非如此。 为什么作者select这种实施validation的方式? 这是什么原因? 特别是:为什么他们不把字符与char1进行比较,而是对sha1进行比较?

实现的sign函数返回与'.'连接的 '.' 和HMAC的值转换为Base64,没有尾随'='(如果有的话)。

实现的无unsign函数与给定input的部分(直到'.' )一样,并检查整个input是否等于sign函数的输出。

关于使用散列值进行比较,笔者试图抵御定时攻击 ,攻击者可以观察到每个字符的检查时间是否相等,并通过两次尝试之间的微小变化来确定检查失败的字符,以及此后尝试逐个性地猜测任意部分的MAC值。 通过比较使用sha1摘要代码需要的时间只取决于给定的整个input长度。

更有趣的一面是从Base64编码的MAC中删除填充'=',我不知道他们为什么要这样做,因为有Base64的URL安全变体 。