2012-04-20 41 views
9

tài liệu Xuân nói rằng nhớ tôi được thực hiện bằng cách lưu trữ thông tin sau trong cookie -Xuân quản lý xác thực lỗ hổng bảo mật

base64 (username + ":" + expirationTime + ":" + md5Hex (username + ":" + expirationTime + ":" mật khẩu + ":" + phím))

tôi có nhầm lẫn sau -

  1. Tại sao sử dụng một n băm không an toàn như MD5 để tiêu hóa thông tin thay vì sử dụng SHA-1 hoặc SHA-2. Liệu hiệu suất đạt được từ đây có đáng kể đối với một mẩu thông tin nhỏ như vậy không?

  2. Tại sao truyền thông tin này qua mạng? Tại sao không duy trì một bản đồ về số ngẫu nhiên an toàn mã hóa và thông tin này trên máy chủ, chỉ trả lại khóa bản đồ dưới dạng cookie. AFAIK đây là cách tiếp cận được sử dụng bởi API Servlet và được coi là an toàn hơn.

Trả lời

10

Hãy bắt đầu với câu hỏi thứ hai bởi vì nó là phù hợp hơn một:

câu hỏi thứ hai "Tại sao truyền mật khẩu qua mạng tại tất cả ...." Câu trả lời:

Bởi vì những gì bạn mô tả chỉ là Simple Hash-Based Token Approach

Nếu bạn cuộn xuống trang Spring Security Reference: Chapter 10 Remember-Me Authentication, bạn sẽ thấy rằng bảo mật mùa xuân cũng có thể sử dụng một cách khác nhớ tôi tiếp cận: Chapter 10.3 Persistent Token Approach. Và đây là những gì bạn đề xuất trong câu hỏi thứ hai của mình.


đầu tiên câu hỏi: Câu trả lời ngắn để "? Sẽ thực hiện hit từ những có ý nghĩa đối với một mảnh nhỏ như vậy thông tin" - Không

Vì vậy, nếu bạn muốn sử dụng Simple Hash-Based Token Approach và cảm thấy rằng MD5 không được bảo mật, thì bạn có thể phân lớp TokenBasedRememberMeService[javadoc] và ghi đè phương thức String makeTokenSignature(long tokenExpiryTime, String username, String password). Ví dụ (chưa được kiểm tra)

protected String makeTokenSignature(long tokenExpiryTime, String username, String password) { 
    String data = username + ":" + tokenExpiryTime + ":" + password + ":" + getKey(); 
    MessageDigest digest; 
    try { 
     digest = MessageDigest.getInstance("SHA-256"); 
    } catch (NoSuchAlgorithmException e) { 
     throw new IllegalStateException("No SHA-256 algorithm available!"); 
    } 

    return new String(Hex.encode(digest.digest(data.getBytes()))); 
} 
+0

Ghi đè makeTokenSignature() trông giống như một cách tốt để đi, vì tôi không nghĩ rằng SHA-2 có thể bị hỏng. Tôi tự hỏi trong trường hợp nào người ta sẽ cần phải sử dụng một cách tiếp cận mã thông báo liên tục ở tất cả. –

+0

Bởi vì phương pháp tiếp cận bền bỉ thì an toàn hơn nhiều. Không cung cấp thông tin về mật khẩu luôn tốt hơn sau đó gửi mật khẩu được mã hóa. - Nhưng cuộc thảo luận này có khuynh hướng lý thuyết. - Dù sao tôi thích phương pháp tiếp cận mã thông báo liên tục, vì điều này cho phép các tính năng bổ sung như xóa mã thông báo như vậy. – Ralph

+0

Cách tiếp cận mã thông báo liên tục chắc chắn tốt hơn nhưng tôi không chắc chắn những gì không an toàn khi sử dụng MD5 trong trường hợp này, nơi mà về cơ bản nó được sử dụng làm chữ ký. Bạn sẽ cần truy cập vào cả mật khẩu băm và khóa sinh sản mã băm MD5. – sourcedelica

4

Băm MD5 được sử dụng bởi mã thông báo Hash đơn giản không phải là lỗ hổng của phương pháp đó.

Sử dụng MD5 vào mật khẩu băm là nguy hiểm vì, với giá trị băm của mật khẩu hiện có, bạn có thể tìm thấy một mật khẩu khác có cùng giá trị (sử dụng bảng cầu vồng).

Tuy nhiên, trong trường hợp này MD5 không được sử dụng để băm mật khẩu nhưng đang được sử dụng làm MAC. Nếu bạn đã sử dụng một bảng cầu vồng để tìm một giá trị va chạm với băm đó, bạn có thể sử dụng chính xác giá trị đó như thế nào?

Sử dụng hàm băm khác cho cookie có thể khiến bạn cảm thấy an toàn hơn nhưng không cung cấp thêm bất kỳ bảo mật nào trong trường hợp này.

Nếu bạn muốn bảo mật hơn thì bạn nên sử dụng phương pháp tiếp cận mã thông báo Persistent Hash. Hash Token đơn giản cho thấy tên người dùng trong văn bản rõ ràng và dễ bị tấn công phát lại. The Persistent Token tránh những vấn đề này.

Dù bằng cách nào bạn cũng nên bảo mật cookie nhớ-me của mình bằng cách đặt cờ Bảo mật và chỉ chạy HTTPS.

+0

(+1) để giải thích rõ ràng những ưu điểm của phương pháp tiếp cận mã thông báo Hash Persistent - thậm chí nó chỉ là một câu hỏi từ các bình luận – Ralph

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