PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Phương pháp bảo mật để lưu trữ / truy xuất khóa cá nhân PGP và cụm mật khẩu?

(Lưu ý:Tôi không phải là chuyên gia bảo mật. Tôi quan tâm đến lĩnh vực này, nhưng chỉ có vậy. Hãy ghi nhớ điều đó.)

Nếu có thể, tuyệt đối không lưu trữ mật khẩu

Nó phụ thuộc rất nhiều vào nhu cầu của bạn là gì. Lựa chọn tốt nhất là không sử dụng mã hóa hai chiều; nếu bạn chỉ có thể lưu trữ muối băm một chiều tiêu hóa mật khẩu đó là lý tưởng. Bạn vẫn có thể kiểm tra chúng để xem chúng có khớp với mật khẩu được cung cấp từ người dùng hay không nhưng bạn không bao giờ lưu trữ nó.

Vẫn tốt hơn, nếu khách hàng của bạn sử dụng một số giao thức lành mạnh (tức là:không phải HTTP thường được triển khai), bạn có thể sử dụng cơ chế xác thực phản hồi thử thách điều đó có nghĩa là ứng dụng của bạn không bao giờ bao giờ cần phải xem mật khẩu của người dùng, ngay cả khi xác thực chúng. Đáng buồn là điều này hiếm khi có thể xảy ra trên web công cộng, nơi có tính năng bảo mật khiến các lập trình viên của thập niên 80 phải xấu hổ.

Nếu bạn phải lưu trữ mật khẩu, hãy cách ly các khóa khỏi ứng dụng

Nếu bạn phải có khả năng giải mã mật khẩu, lý tưởng nhất là bạn không nên có tất cả các chi tiết để làm như vậy ở một nơi và chắc chắn không phải là một nơi có thể sao chép, dễ dàng truy cập.

Vì lý do đó, cá nhân tôi không muốn sử dụng PgCrypto (như bạn đang làm) cho mục đích này vì nó buộc bạn phải tiết lộ khóa riêng tư và (nếu nó có) cụm mật khẩu cho máy chủ, nơi nó có thể bị lộ trong PostgreSQL's các tệp nhật ký hoặc có khả năng bị đánh hơi. Tôi muốn thực hiện phía khách hàng tiền điện tử của mình, nơi tôi có thể sử dụng PKCS # 11, một tác nhân chính hoặc các công cụ khác cho phép tôi giải mã dữ liệu mà không cần mã của tôi có thể truy cập vào khóa.

Vấn đề lưu trữ khóa an toàn là một phần của nguyên nhân PKCS # 11 được phát minh cho. Nó cung cấp giao diện chung cho các ứng dụng và nhà cung cấp tiền điện tử để nói chuyện với bất kỳ thứ gì có thể cung cấp các dịch vụ ký và giải mã nhất định mà không bao giờ tiết lộ khóa của nó . Thông thường, nhưng không chỉ, việc sử dụng là với tiền điện tử dựa trên phần cứng như thẻ thông minh và mô-đun tiền điện tử phần cứng. Các thiết bị như vậy có thể được yêu cầu ký hoặc giải mã dữ liệu được chuyển cho chúng và có thể làm như vậy mà không bao giờ tiết lộ khóa. Nếu có thể, hãy cân nhắc sử dụng thẻ thông minh hoặc HSM. Theo như tôi biết thì PgCrypto không thể sử dụng PKCS # 11 hoặc các HSM / thẻ thông minh khác.

Nếu bạn không thể làm điều đó, bạn vẫn có thể sử dụng tác nhân quản lý khóa, nơi bạn tải khóa của mình vào chương trình quản lý khóa theo cách thủ công khi máy chủ khởi động và chương trình quản lý khóa cung cấp giao diện PKCS # 11 (hoặc một số khác) để ký và giải mã thông qua một ổ cắm. Bằng cách đó, ứng dụng web của bạn không bao giờ cần biết khóa. gpg-agent có thể đủ điều kiện cho mục đích này. Một lần nữa, theo như tôi biết PgCrypto không thể sử dụng đại lý quản lý khóa, mặc dù nó sẽ là một tính năng tuyệt vời để thêm vào.

Ngay cả một cải tiến nhỏ cũng có thể giúp ích. Tốt nhất là nếu cụm mật khẩu cho khóa của bạn không được lưu trữ trên đĩa, vì vậy bạn có thể yêu cầu nhập cụm mật khẩu đó khi ứng dụng được khởi động để khóa có thể được giải mã. Bạn vẫn đang lưu trữ khóa đã giải mã trong bộ nhớ, nhưng tất cả các chi tiết để giải mã nó không còn trên đĩa nữa và dễ lấy. Kẻ tấn công khó lấy cắp khóa được giải mã từ bộ nhớ hơn nhiều so với lấy "password.txt" từ đĩa.

Những gì bạn chọn làm phụ thuộc rất nhiều vào chi tiết về nhu cầu bảo mật của bạn và dữ liệu bạn đang làm việc. Ở vị trí của bạn, tôi sẽ không lưu trữ mật khẩu nếu có thể, và nếu có, tôi muốn sử dụng thiết bị phần cứng tương thích PKCS # 11.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Khai thác tối đa chỉ mục PostgreSQL của bạn

  2. Kết nối với Google Cloud PostgreSQL qua JDBC với SSL

  3. Lỗi biểu mẫu / cơ sở dữ liệu Django:giá trị quá dài đối với ký tự loại thay đổi (4)

  4. Làm cách nào để nhận lệnh postgres 'nth_value' tương đương trong SQL pyspark Hive?

  5. Không thể lưu trữ Euro-sign vào thuộc tính LOB String với Hibernate / PostgreSQL