在对比密码哈希的时候,会用到
timingSafeEqual()
,如下代码export async function comparePasswords({ password, salt, hashedPassword, }: { password: string salt: string hashedPassword: string }) { const inputHashedPassword = await hashPassword(password, salt) // 为什么不直接 return inputHashedPassword === hashedPassword? return crypto.timingSafeEqual( Buffer.from(inputHashedPassword, "hex"), Buffer.from(hashedPassword, "hex") ) }
在密码学和安全编程中,
crypto.timingSafeEqual()
是一个非常重要的函数,用于比较两个字符串或缓冲区的内容是否相等。它的主要目的是防止时序攻击(Timing Attack)。什么是时序攻击?
时序攻击是一种侧信道攻击(Side-Channel Attack),攻击者通过观察程序执行的时间差异来推断敏感信息。例如:
- 在密码验证的场景中,如果程序使用普通的字符串比较(如
===
或==
),当比较的字符串不匹配时,程序可能会提前返回false
,而匹配时则需要比较所有字符。
- 这种时间差异可以被攻击者利用,逐步推断出正确的密码或哈希值。
crypto.timingSafeEqual()
的作用
这是一种安全的比较方法,确保无论两个缓冲区的内容是否匹配,比较操作的时间都是相同的。这样可以防止攻击者通过时间差异推断出敏感信息。