2013-12-18 4 views
10

Ist die eingebaute Methode, einen konstanten Zeitstringvergleich in Go durchzuführen?Sicherer Vergleich von Strings in Go

Ich habe die Devise.secure_compare Methode verwendet, wenn ich diese Funktionalität in Ruby benötigt habe.

+2

secure_compare keine konstante Zeitmethode ist, ruft sie each_byte, die jedes Byte im String iteriert http://apidock.com/ruby/String/each_byte –

+1

"Konstante Zeit" und "sicher" sind sehr unterschiedliche Ziele; Bitte klären Sie, was genau Sie wollen – Vitruvius

+2

@SethHoenig Es ist im Zusammenhang mit Timing-Attacken. Der konstante Zeitvergleich ist nicht mit der Zeitkomplexität verbunden und bedeutet nur, dass die Vergleichsfunktion nicht früh zurückkehrt, wenn eine Differenz gefunden wird (die Informationen darüber verlieren würde, wie stark sich die Eingaben unterscheiden). Die Vergleichsfunktion hängt dann nur von der Länge der Eingaben ab, nicht vom Inhalt. – nemo

Antwort

17

Nicht für Strings, sondern für []byte. Siehe crypto/subtle, insbesondere ConstantTimeCompare:

func ConstantTimeCompare(x, y []byte) int

ConstantTimeCompare gibt 1 iff die beiden gleich langen Scheiben, x und y, haben die gleichen Inhalte. Die Zeit ist abhängig von der Länge der Scheiben und unabhängig vom Inhalt.

Wie Sie vielleicht wissen, Sie ganz einfach einen String in ein Byte-Slice umwandeln kann:

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

Es ist auch wichtig, 'subtile.ConstantTimeEq' zu verwenden, um die Längen der Slices zu vergleichen, weil' subtile.ConstantTimeCompare' zwei gleich lange Slices benötigt. Ansonsten hat es ein "subtiles" Verhalten. Beispiel: http://play.golang.org/p/Xga-wsZvhT – Intermernet

+2

In dem obigen Beispiel (http://play.golang.org/p/Xga-wsZvhT) scheint das Verhalten korrekt zu sein. Scheiben, die nicht gleich lang sind, sind nicht gleich. – stevvooe

Verwandte Themen