如何与golang一起实施slowEqual
我试图用golang实现一个slowEqual,但xor操作仅限于int和int8,我不知道如何将字符串转换为int[]或int8[],即使可以转换,也有点尴尬,我发现字节数相等,但这似乎不是一个slowEqual实现。有什么建议吗? 这是我的恳求如何与golang一起实施slowEqual,go,Go,我试图用golang实现一个slowEqual,但xor操作仅限于int和int8,我不知道如何将字符串转换为int[]或int8[],即使可以转换,也有点尴尬,我发现字节数相等,但这似乎不是一个slowEqual实现。有什么建议吗? 这是我的恳求 //TODO real slow equal func slowEquals(a, b string) bool { al := len(a) bl := len(b) aInts := make([]int, al)
//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 false
}
return subtle.ConstantTimeCompare([]byte(a), []byte(b)) == 1
}
如果长度不同,这会很快返回,但会对原始代码进行计时攻击,从而显示a的长度,因此我认为这不会更糟。添加“else”怎么样?我认为最好在codereview.stackexchange.com上添加。还有三种针对代码的计时攻击:计时lena!=lenb可能会显示是否存在相等,并生成[]字节,lena与[]字节占用的时间不同,而且不管怎样,只需测量函数运行所需的时间,就可以了解a的长度。似乎必须通过计时攻击来显示。无论长度是否相等,为什么不直接使用微妙的ConstantTimeCompare?
import "crypto/subtle"
func SlowEquals(a, b string) bool {
if len(a) != len(b) {
return false
}
return subtle.ConstantTimeCompare([]byte(a), []byte(b)) == 1
}