“恒定时间”字符串比较的意义在于,无论比较目标是什么(未知值),该比较将花费完全相同的时间量。此“恒定时间”不会向攻击者显示有关未知目标值可能是什么的信息。通常的解决方案是比较所有字符,即使在发现不匹配之后也是如此,因此无论在哪里发现不匹配,比较都将在相同的时间内运行。@H_419_1@
当某些条件为真时,其他形式的比较可能会在较短的时间内返回答案,这使攻击者可以了解它们可能会丢失的内容。例如,在典型的字符串比较中,一旦发现不相等的字符,该比较将返回false。如果第一个字符不匹配,则比较返回的时间将短于匹配的时间。勤奋的攻击者可以使用此信息进行更智能的暴力攻击。@H_419_1@
“恒定时间”比较消除了这些额外的信息,因为无论两个字符串如何不相等,该函数都会在相同的时间内返回其值。@H_419_1@
在查看nodejs v4加密库时,我看不到有任何进行恒定时间比较的功能的迹象,并且在本文章中,将讨论有关nodejs加密库缺少此功能的事实。@H_419_1@
编辑:节点v6现在具有crypto.timingSafeEqual(a, b)
。@H_419_1@
在此缓冲区相等-恒定时间模块中还提供了这样的恒定时间比较功能。@H_419_1@