如何与golang一起实施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)

我试图用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)
    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
}