Go中字符串的安全比较

Oll*_*lly 12 go

是一种在Go中进行恒定时间字符串比较的内置方法吗?

Devise.secure_compare当我在Ruby中需要这个功能时,我已经使用过这个方法.

nem*_*emo 21

不是用于字符串而是用于[]byte.crypto/subtle特别参见ConstantTimeCompare:

func ConstantTimeCompare(x, y []byte) int

如果两个相等长度的切片x和y具有相同的内容,则ConstantTimeCompare返回1.所花费的时间是切片长度的函数,并且与内容无关.

您可能知道,您可以轻松地将字符串转换为字节切片:

var x []byte = []byte("someString")
Run Code Online (Sandbox Code Playgroud)

  • 使用`subtle.ConstantTimeEq`来比较切片的长度也很重要,因为需要注意`subtle.ConstantTimeCompare`需要"两个相等长度的切片".否则它会有一些"微妙"的行为.示例:http://play.golang.org/p/Xga-wsZvhT (4认同)
  • 难道 `[]byte([of a string])` 不是一个非常量时间操作,因为将字符串“转换”为字节数组会产生一个副本?看起来这会泄漏预期字符串的长度。 (4认同)
  • 在上面的[示例](http://play.golang.org/p/Xga-wsZvhT)中,行为似乎是正确的.长度不等的切片不相等. (3认同)