Tôi không phải là nhà phát triển Java, nhưng khách hàng của tôi đã thuê một bản cập nhật một số tệp JAR trên trang web của họ. Trước khi làm như vậy, chúng tôi đã kiểm tra mã hiện có và tìm thấy một số lỗ hổng bảo mật. Một trong những giải pháp chúng tôi sử dụng để làm cho các tệp an toàn hơn là tạo một người dùng cơ sở dữ liệu mới với quyền truy cập chỉ đọc vào cơ sở dữ liệu và chỉ dành cho những bảng mà các tệp JAR cần để hoạt động. Sau đó tôi phát hiện ra rằng họ đang lưu trữ các thông tin đăng nhập này trong các tệp văn bản thuần túy cùng với các tệp JAR, chỉ có một số người được giáo dục đoán từ công chúng nói chung. Và cuối cùng hôm nay họ đang yêu cầu nhiều đặc quyền cơ sở dữ liệu lỏng lẻo hơn, nhưng tôi không nghĩ rằng cô ấy hiểu rằng cô ấy thực sự không cần chúng cho một tệp JAR được viết đúng cách.Các kết nối cơ sở dữ liệu an toàn thường được thực hiện như thế nào trong các tệp JAR?
Dù sao, tôi khá chắc chắn nhà phát triển này sẽ không biết lỗ hổng bảo mật nếu nó cắn cô ấy ở mặt sau. Và tôi không biết đủ về các tệp Java/JAR để tư vấn cho cô ấy về những gì cô ấy nên làm, chỉ đủ về infosec để nói cho cô ấy biết cô ấy không nên làm gì.
Vậy các cân nhắc bảo mật điển hình khi viết tệp JAR được phân phối kết nối với cơ sở dữ liệu MySQL từ xa là gì? Có cách nào tiêu chuẩn để mã hóa chi tiết kết nối (tên người dùng và/hoặc mật khẩu) không? IIRC, không phải tệp .jar vừa tôn vinh lưu trữ ZIP và không ai có thể giải nén tệp và xem chi tiết kết nối trong mã nguồn? Có cách nào để mã hóa nội dung tệp jar không?
CẬP NHẬT: Tôi đã nhận được giải thích rõ sau đây từ nhà phát triển. Điều này có đúng không?
Tất cả các lớp trong tệp jar được mã hóa. tôi luôn mã hóa tất cả các tệp lớp trước khi lưu trữ chúng trong tệp jar. nếu bạn mở bất kỳ lọ [redacted] nào, bạn sẽ chỉ thấy mã được mã hóa. do đó không có cơ hội để người dùng có thể xem mã nguồn bằng cách giải mã lớp được phân loại. các lớp học sử dụng jdbc để kết nối với db, tìm kiếm eangine cần kết nối với DB để chạy sqls. các sqls này nằm trong các clase được mã hóa trong tệp jar.
khi tôi hỏi bạn về việc mã hóa mật khẩu DB, ý tôi là những gì bạn nói bên dưới. chúng ta sẽ viết mã mã hóa/giải mã trong java và sử dụng nó. Lớp được biên dịch từ mã nguồn này một lần nữa sẽ được mã hóa như là một phần của thủ tục mã hóa lớp reoutine. Chúng tôi sử dụng một công cụ obfuscation Java gọi là Retroguard để mã hóa tất cả các lớp. chúng tôi cũng nhúng một khóa vào trang html để đảm bảo rằng ứng dụng sẽ chỉ hoạt động nếu nó đã được tải xuống biểu mẫu [redacted]. nếu người dùng sao chép bình vào máy cục bộ của mình và cố gắng chạy nó, nó sẽ thất bại.
Hệ thống DB của bạn hỗ trợ tùy chọn đăng nhập nào? Nó có hỗ trợ sử dụng các phím đã ký (a la SSH) thay vì sử dụng/pass không? Có các cơ chế xác thực khác (LDAP, AD, PAM) trong môi trường có thể được sử dụng thay cho DB auth không? – Freiheit
Nếu bạn mã hóa các chi tiết, thì bạn sẽ cần phải giải mã chúng trên máy khách. Trò chơi kết thúc. Sau đó, bạn có thể sẽ gửi cho họ trong rõ ràng trên dây - có nghĩa là một kẻ thù không cần phải thậm chí bận tâm có Java cài đặt. –
Cảm ơn Tom, tôi đã không nghĩ rằng kết quả cuối cùng vượt trội hơn bất kỳ bảo mật nào chúng tôi thực hiện trong thiết kế. Người dùng mysql đặc biệt này có quyền truy cập chỉ đọc, vì vậy tôi gần như bị cám dỗ để nói "OK, bất cứ điều gì, ít nhất họ không thể thay đổi dữ liệu nếu họ nhận được các thông số kết nối" nhưng tôi không cảm thấy rất tốt về nó trong thời gian dài. –