Go中字符串的安全比较

Go中字符串的安全比较,go,Go,在Go中,是否内置了进行常量时间字符串比较的方法 我在Ruby中需要此功能时使用了此方法。不是用于字符串,而是用于[]字节。尤其见: func ConstantTimeCompare(x,y[]字节)int ConstantTimeCompare在两个等长切片(x和y)的内容相等时返回1。所花费的时间是切片长度的函数,与内容无关 如您所知,您可以轻松地将字符串转换为字节片: var x []byte = []byte("someString") secure_compare不是一个常量时间方法

在Go中,是否内置了进行常量时间字符串比较的方法


我在Ruby中需要此功能时使用了此方法。

不是用于字符串,而是用于
[]字节。尤其见:

func ConstantTimeCompare(x,y[]字节)int

ConstantTimeCompare在两个等长切片(x和y)的内容相等时返回1。所花费的时间是切片长度的函数,与内容无关

如您所知,您可以轻松地将字符串转换为字节片:

var x []byte = []byte("someString")

secure_compare不是一个常量时间方法,它调用每个_字节,迭代字符串中的每个字节,“常量时间”和“secure”是非常不同的目标;请澄清你的具体想法want@SethHoenig这是在定时攻击的背景下。恒定时间比较与时间复杂度无关,仅意味着在发现差异时比较函数不会提前返回(这将泄漏输入差异程度的信息)。然后,比较函数仅取决于输入的长度,而不取决于内容。使用
细微。Constanttimeq
比较切片的长度也很重要,因为要注意
细微。ConstantTimeCompare
需要“两个等长切片”。否则,它会有一些“微妙”的行为。示例:在上面的例子中,行为似乎是正确的。长度不相等的切片也不相等。时间比较不是常数,是吗?计时攻击可能会计算出正确的长度。@MichaelBaldry当数组长度不相等时,函数在恒定时间内返回false,当数组长度相等时,函数在(不同的)恒定时间内返回true。因此,函数不会通过计时泄露有关内容正确性的信息。
[]字节([字符串])
不是一个非常量时间操作吗,因为将字符串“强制转换”到字节数组会产生副本?似乎这会泄漏预期字符串的长度。