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.
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.
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")
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
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
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 –
"stały czas" i "bezpieczny" to bardzo różne cele; proszę wyjaśnić, co dokładnie chcesz – Vitruvius
@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