2013-12-18 27 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