2013-12-18 14 views
10

Là cách tích hợp để thực hiện so sánh chuỗi thời gian không đổi trong Go?So sánh an toàn các chuỗi trong Go

Tôi đã sử dụng phương thức Devise.secure_compare khi tôi cần chức năng này trong Ruby.

+2

secure_compare không phải là một phương pháp thời gian liên tục, nó gọi each_byte, mà lặp qua tất cả các byte trong chuỗi http://apidock.com/ruby/String/each_byte –

+1

"thời gian cố định" và "an toàn" là các mục tiêu rất khác nhau; xin vui lòng làm rõ chính xác những gì bạn muốn – Vitruvius

+2

@SethHoenig Đó là trong bối cảnh của các cuộc tấn công thời gian. So sánh thời gian không đổi không liên quan đến độ phức tạp thời gian và chỉ có nghĩa là hàm so sánh không trả về sớm khi phát hiện sự khác biệt (có thể làm rò rỉ thông tin về số lượng đầu vào khác nhau). Hàm so sánh sau đó chỉ phụ thuộc vào độ dài của các đầu vào, không phụ thuộc vào nội dung. – nemo

Trả lời

17

Không dành cho chuỗi nhưng đối với []byte. Xem crypto/subtle, đặc biệt là ConstantTimeCompare:

func ConstantTimeCompare(x, y []byte) int

ConstantTimeCompare trả về 1 khi và chỉ khi hai chiều dài bằng nhau lát, x và y, có nội dung như nhau. Thời gian thực hiện là một hàm của độ dài của các lát và độc lập với nội dung.

Như bạn đã biết, bạn có thể dễ dàng chuyển đổi một chuỗi để một lát byte:

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

Cũng rất quan trọng để sử dụng 'subtle.ConstantTimeEq' để so sánh độ dài của các lát do báo trước rằng' subtle.ConstantTimeCompare' cần "hai lát chiều dài bằng nhau". Nó có một số hành vi "tinh tế" khác. Ví dụ: http://play.golang.org/p/Xga-wsZvhT – Intermernet

+2

Trong [ví dụ] (http://play.golang.org/p/Xga-wsZvhT) ở trên, hành vi có vẻ đúng. Các lát không có chiều dài bằng nhau không bằng nhau. – stevvooe

Các vấn đề liên quan