2013-12-18 17 views
10

Git'de sabit zaman dizisi karşılaştırması yapmanın yerleşik bir yolu mu?Git İçinde Dizeleri Güvenli Karşılaştır

Bu işlevselliğe Ruby uygulamasında ihtiyaç duyduğumda Devise.secure_compare yöntemini kullandım.

+2

secure_compare sabit zaman yöntemi değildir, bu dizede her byte üzerinde dolaşır each_byte, aramalar http://apidock.com/ruby/String/each_byte –

+1

"Sabit zaman" ve "güvenli" çok farklı hedeflerdir; lütfen tam olarak ne istediğini netleştirin – Vitruvius

+2

@SethHoenig Zamanlama saldırıları bağlamında. Sabit zaman karşılaştırması zaman karmaşıklığı ile ilgili değildir ve sadece bir fark bulunduğunda karşılaştırma fonksiyonunun erken dönmediği anlamına gelir (bu da girdilerin ne kadar farklı olduğu hakkında bilgi sızdırmaz). Karşılaştırma işlevi daha sonra, içeriğe değil, yalnızca girdilerin uzunluğuna bağlıdır. – nemo

cevap

17

Dizeler için değil, []byte için. ,

func ConstantTimeCompare(x, y []byte) int

ConstantTimeCompare iki eşit uzunlukta dilimleri, x ve y, ancak ve ancak 1 döndürür eşit içeriğe sahiptir: Özellikle ConstantTimeComparecrypto/subtle bakınız. Alınan süre dilimlerin uzunluğunun bir fonksiyonudur ve içerikten bağımsızdır. Eğer, kolayca bir bayt dilime bir dize dönüştürebilirsiniz Bildiğiniz gibi

:

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

Ayrıca 'subtle.ConstantTimeCompare' 'iki eşit uzunluklu dilime' ihtiyaç duyduğu uyarılar nedeniyle dilimlerin uzunluklarını karşılaştırmak için 'subtle.ConstantTimeEq' kullanmak da önemlidir. Aksi takdirde bazı "ince" davranışa sahiptir. Örnek: http://play.golang.org/p/Xga-wsZvhT – Intermernet

+2

Yukarıdaki örnekte (http://play.golang.org/p/Xga-wsZvhT) davranış doğru görünüyor. Eşit uzunlukta olmayan dilimler eşit değildir. – stevvooe

İlgili konular