2013-12-18 25 views
10

是在Go中进行恒定字符串比较的内置方式吗?在Go中安全地比较字符串

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

+2

secure_compare不是一个常数时间的方法,它调用each_byte,它遍历每个字节的字符串中 http://apidock.com/ruby/String/each_byte –

+1

“恒定时间”和“安全”是非常不同的目标;请澄清你到底想要什么 – Vitruvius

+2

@SethHoenig它是在定时攻击的情况下。常量时间比较与时间复杂度无关,仅意味着比较函数在发现差异时不会早期返回(这会泄漏多少输入不同的信息)。比较函数仅取决于输入的长度,而不取决于内容。 – nemo

回答

17

不适用于字符串,但适用于[]byte。见crypto/subtle,尤其ConstantTimeCompare

func ConstantTimeCompare(x, y []byte) int

ConstantTimeCompare返回1当且仅​​当两个相等长度的切片,x和y,具有相等的内容。所花费的时间是切片长度的函数,并且与内容无关。

正如你可能知道,你可以将字符串很容易转换为字节片:

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

使用'subtle.ConstantTimeEq'来比较切片的长度也很重要,因为'subtle.ConstantTimeCompare'需要“两个等长的切片”。它有一些“微妙”的行为,否则。示例:http://play.golang.org/p/Xga-wsZvhT – Intermernet

+2

在上面的[示例](http://play.golang.org/p/Xga-wsZvhT)中,行为似乎是正确的。不等长的切片不相等。 – stevvooe