2014-04-19 37 views
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  
    } 
} 
+0

我認爲這是更好的codereview.stackexchange.com。對於代碼,仍然有三種定時攻擊:timing len(a)!= len(b)可能會顯示是否存在相等性,並且make([] byte,len(a))的取值與[] byte (b),並且無論如何,只需通過測量函數運行所花費的時間,就可以瞭解a的長度。 –

+0

時間攻擊似乎必須透露。爲什麼不只是使用微妙的.ConstantTimeCompare不管長度是否相等? – ggaaooppeenngg

回答

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 
} 

這很快返回,如果長度是不同的,但有對原代碼的時間攻擊揭示了一個的長度,所以我認爲這並不壞。

+0

what abou add a'else'? – ggaaooppeenngg