0
我試圖用golang實現slowEqual,但xor操作僅限於int和int8,我不知道如何將字符串轉換爲int []或int8 [],即使它可以轉換它似乎有點尷尬,我發現bytes.Equal但似乎不是一個slowEqual實現。任何建議? 這是我的實現。如何使用golang實現slowEqual
//TODO real slow equal
func slowEquals(a, b string) bool {
al := len(a)
bl := len(b)
aInts := make([]int, al)
bInts := make([]int, bl)
for i := 0; i < al; i++ {
aInts[i] = int(a[i])
}
for i := 0; i < bl; i++ {
bInts[i] = int(b[i])
}
var diff uint8 = uint8(al^bl)
for i := 0; i < al && i < bl; i++ {
diff |= a[i]^b[i]
}
return diff == 0
//長度相等爲0
/*
abytes := []int8()
bbytes := []int8()
al := len(a)
bl := len(b)
diff := al^bl
for i := 0; i < al && i < bl; i++ {
diff |= a[i]^b[i]
}
return diff == 0
*/
}
或者:(第一個回答後)
import "crypto/subtle"
func SlowEquals(a, b string) bool {
if len(a) != len(b) {
return subtle.ConstantTimeCompare([]byte(a), make([]byte,len(a))) == 1
}else{
return subtle.ConstantTimeCompare([]byte(a), []byte(b)) == 1
}
}
我認爲這是更好的codereview.stackexchange.com。對於代碼,仍然有三種定時攻擊:timing len(a)!= len(b)可能會顯示是否存在相等性,並且make([] byte,len(a))的取值與[] byte (b),並且無論如何,只需通過測量函數運行所花費的時間,就可以瞭解a的長度。 –
時間攻擊似乎必須透露。爲什麼不只是使用微妙的.ConstantTimeCompare不管長度是否相等? – ggaaooppeenngg