2013-12-18 16 views
10

Czy wbudowany sposób ciągłego porównywania łańcuchów czasu w trybie Go?Bezpieczne porównywanie ciągów w Go

Użyłem metody Devise.secure_compare, gdy potrzebuję tej funkcji w Ruby.

+2

secure_compare nie jest stała metoda razem wywołuje each_byte, który wykonuje iteracje nad każdy bajt w ciągu http://apidock.com/ruby/String/each_byte –

+1

"stały czas" i "bezpieczny" to bardzo różne cele; proszę wyjaśnić, co dokładnie chcesz – Vitruvius

+2

@SethHoenig Jest to w kontekście ataków czasowych. Stałe porównywanie czasu nie jest związane ze złożonością czasu i oznacza tylko, że funkcja porównania nie powraca wcześnie, gdy zostanie znaleziona różnica (która mogłaby ujawnić, ile różnią się dane wejściowe). Funkcja porównania zależy wtedy tylko od długości danych wejściowych, a nie od zawartości. – nemo

Odpowiedz

17

Nie na smyczki, ale na []byte. Patrz crypto/subtle zwłaszcza ConstantTimeCompare:

func ConstantTimeCompare(x, y []byte) int

ConstantTimeCompare zwraca 1 iff Dwie równe plastry długość, X i Y mają takie same treści. Czas jest funkcją długości odcinków i jest niezależny od zawartości.

Jak wiadomo, można łatwo przekonwertować ciąg do plasterka bajtów:

var x []byte = []byte("someString") 
+3

Ważne jest również użycie 'subtle.ConstantTimeEq' do porównania długości plasterków ze względu na zastrzeżenie, że' subtle.ConstantTimeCompare' potrzebuje "dwóch równych kawałków". W przeciwnym razie ma jakieś "subtelne" zachowanie. Przykład: http://play.golang.org/p/Xga-wsZvhT – Intermernet

+2

Powyższe zachowanie wydaje się być poprawne w [przykład] (http://play.golang.org/p/Xga-wsZvhT). Plastry, które nie mają równej długości, nie są równe. – stevvooe

Powiązane problemy