2009-08-31 43 views
16

Tôi bắt đầu viết một ứng dụng web nhỏ và đã bắt đầu suy nghĩ về việc bảo mật thông tin đăng nhập (chỉ được sử dụng để quản trị).Xác thực bảo mật mà không cần SSL

Nếu có thể, tôi sẽ cài đặt chứng chỉ SSL CACert hoặc tự ký, vì hiện tại tôi sẽ là người duy nhất đăng nhập nhưng máy chủ của tôi không quá sức chứa.

Có bất kỳ tùy chọn hợp lý nào để đảm bảo trang web không có SSL không? Tôi đã suy nghĩ về các tùy chọn xác thực:

  1. Thực hiện băm muối trong JavaScript. Khi trang đăng nhập được tải, tạo ra một máy chủ muối bên. Gửi nó cho khách hàng trong rõ ràng và lưu nó trong một biến phiên.

  2. Xác thực thông báo. Tôi chỉ tìm thấy ý tưởng này duyệt SO, và nó có thể là hợp lý hơn rất nhiều so với cán auth của riêng tôi.

  3. OpenID. Đó là một tiêu chuẩn mở, không yêu cầu mật khẩu (và tôi có thể "xâm nhập" SSL của nhà cung cấp OpenID của tôi để thêm bảo mật cho quá trình đăng nhập), nhưng tôi không biết OpenID hoạt động như thế nào hoặc bảo mật như thế nào. (Nhu cầu nghiên cứu Ví dụ, một xác thực OpenID có thể được thực hiện lại.?)

Vấn đề với tất cả trong số đó là:

  • phiên có thể bị bắt cóc
  • Chỉ đăng nhập là an toàn, tất cả mọi thứ khác là trong rõ ràng

Tùy chọn duy nhất tôi có thể nghĩ đến để bảo mật ứng dụng sau khi đăng nhập là một số JavaScript kinh tởm và gửi mã hóa ASCII qua lại. Tôi không muốn làm điều này.

Có mã hóa nào (để tải trang và POST) có thể được triển khai bằng ngôn ngữ kịch bản lệnh phía máy chủ mà không có sự gia trì hoặc sự tham gia của máy chủ của tôi, nhưng trình duyệt đó có hỗ trợ không? Các phiên có thể được bảo vệ khỏi bị tấn công (thực tế) mà không có SSL không?

Bạn sẽ làm gì trong tình huống như thế này?

Trả lời

9

Bạn có thể xác thực một cách an toàn mà không cần thực hiện bảo vệ chống nghe lén. Ví dụ: bạn có thể ngăn người khác gửi yêu cầu, mặc dù họ có thể đọc nội dung yêu cầu của bạn. Nếu bạn cần phải bảo vệ chống lại nghe lén, tôi khuyên bạn nên chỉ cần đi một nơi nào đó, nơi bạn có thể sử dụng SSL.

Nếu bạn chỉ cần xác thực đơn giản mà không cần bảo mật thực, nhà cung cấp của bạn có thể sẽ hỗ trợ HTTP cơ bản. Điều này (cùng với một thiết kế tốt mà hạn chế khả năng, và sao lưu;) là một giải pháp tạm thời hợp lý trong khi bạn lo lắng về các vấn đề khác.

Để xác thực danh tính của bạn, không thể phát lại OpenID. Mỗi chuỗi xác thực được ký. Tuy nhiên, OpenID tự nó chỉ cho phép bạn thiết lập danh tính của mình với máy chủ. Nó sẽ không cho phép bạn đăng nhập hoặc xác thực yêu cầu khác. OAuth sẽ, nhưng nó yêu cầu mã hóa giao thông cho một phần của giao thức.

Bạn có thể ký từng yêu cầu bằng bí mật dùng chung. Điều này sẽ ngăn chặn kẻ tấn công gửi hoặc phát lại yêu cầu, nhưng bản thân yêu cầu vẫn có thể được đọc bởi người nghe trộm. Xem tài liệu để xác thực Amazon AWS (bao gồm thư viện máy khách) hoặc xác thực của Flickr. Giao thức cơ bản là:

  • đòi hỏi một dấu thời gian (và có lẽ một nonce) như yêu cầu thông số
  • bình thường hóa, sắp xếp, nối tất cả các yêu cầu thông số
  • concatenate với URI, sở tại, động từ, vv
  • băm với khóa bí mật
  • gửi băm trong tiêu đề với yêu cầu
  • máy chủ cũng làm như vậy và so sánh chữ ký
+0

làm thế nào để thực hiện điều này u nói? –

1

Nếu bạn đăng ký địa chỉ IP từ xa trong phiên, nó không thể bị tấn công. Ai đó đang cố gắng sử dụng phiên với một địa chỉ IP khác có thể dễ dàng được phát hiện. Phiên PHP sử dụng theo mặc định (và tôi đoán nó không phải là tùy chọn). Giải pháp đơn giản và hiệu quả.

+0

Đó là một điểm tuyệt vời, nhưng hạn chế một phiên tới một IP duy nhất không bảo vệ chống lại những kẻ tấn công trên cùng một mạng (khi một phiên có nhiều khả năng bị tấn công nhất). – s4y

+2

Nó cũng phá vỡ một số tình huống proxy (bao gồm cả BlackBerry). –

+1

Và cũng trên các mạng di động, [IP của bạn có thể thay đổi trong phiên] (http://stackoverflow.com/questions/7550798/can-ip-change-during-session). – TMS

3

Nếu bạn đang tiếp cận điều này như là một cách thú vị để chơi với các phương pháp mã hóa và xác thực khác nhau, nhưng giải pháp rẻ nhất và đơn giản nhất là có được một máy chủ nơi bạn có thể cài đặt chứng chỉ SSL.

+1

Ngay bây giờ, một kẻ tấn công sẽ có rất ít để đạt được bằng cách phá vỡ ứng dụng của tôi, vì vậy nó chắc chắn là một thử nghiệm. – s4y

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