2011-11-19 6 views
22

Tôi đang phát triển một ứng dụng đọc một số dữ liệu từ một db. Kết nối với db được thực hiện thông qua cơ chế đăng nhập/mật khẩu chuẩn.Java - Cách lưu trữ mật khẩu được sử dụng trong ứng dụng?

Vấn đề là: cách lưu trữ mật khẩu db? Nếu tôi lưu trữ nó như là một thành viên lớp, nó có thể dễ dàng lấy ra thông qua một hoạt động dịch ngược.

Tôi nghĩ rằng obfuscation không giải quyết được vấn đề, vì một mật khẩu chuỗi có thể được tìm thấy dễ dàng cũng trong mã obfuscated.

Mọi người đều có đề xuất?

+2

Đây có phải là cơ sở dữ liệu của bạn hay cơ sở dữ liệu của khách hàng. Nếu đó là cơ sở dữ liệu của khách hàng, anh ta nên biết mật khẩu của nó. Nếu đó là cơ sở dữ liệu của bạn, nó nằm ở đâu? Tại sao một ứng dụng khách hàng sẽ trực tiếp truy cập cơ sở dữ liệu, mà không phải thông qua một số máy chủ lưu trữ mật khẩu, và nơi mã byte không có sẵn cho các máy khách? –

+1

Tôi thường lưu trữ mã hóa cứng trong ứng dụng dưới dạng Chuỗi được mã hóa bằng Rot13. (đùa). –

+0

Nếu bạn đang sử dụng Java EE, có một số cơ chế tiêu chuẩn để giải quyết vấn đề này ... nhưng tôi đoán bạn thì không. Tôi không nghĩ rằng nó giúp bảo mật để ẩn mật khẩu nếu ứng dụng của bạn cho phép truy cập đầy đủ vào db. – toto2

Trả lời

20

Không bao giờ mã hóa mật khẩu cứng vào mã của bạn. Điều này đã được đưa ra gần đây trong số Top 25 Most Dangerous Programming Mistakes

Mã hóa tài khoản và mật khẩu bí mật trong phần mềm của bạn cực kỳ tiện lợi - cho kỹ sư đảo ngược có kỹ năng. Nếu mật khẩu giống nhau trên tất cả các phần mềm của bạn, thì mọi khách hàng sẽ trở nên dễ bị tổn thương khi mật khẩu đó chắc chắn trở nên nổi tiếng. Và bởi vì nó được mã hóa cứng, đó là một nỗi đau lớn để sửa chữa.

Bạn nên lưu trữ thông tin cấu hình, bao gồm mật khẩu, trong một tệp riêng biệt mà ứng dụng đọc khi bắt đầu. Đó là cách duy nhất thực sự để ngăn chặn mật khẩu bị rò rỉ như là kết quả của việc giải mã (không bao giờ biên dịch nó thành nhị phân để bắt đầu).

Xem câu trả lời này tuyệt vời cho lời giải thích chi tiết hơn: By William Brendel

0

Đối với một ứng dụng nhỏ và đơn giản mà bạn không muốn liên quan đến rất nhiều biện pháp an ninh khác, điều này có lẽ nên là một lựa chọn cấu hình. Khi bạn triển khai ứng dụng của mình, nó có thể đọc một tệp cấu hình nơi các thuộc tính kết nối cơ sở dữ liệu được chỉ định. Điều này có nghĩa là mỗi ứng dụng không biết mật khẩu, nhưng bạn cần truy cập vào máy chủ để tìm mật khẩu.

0

Một số dữ liệu phải được định cấu hình. Ngay bây giờ như bạn đã nói, đó có thể là usernamepassword hoặc một số phổ biến datas; Thông thường những gì chúng ta làm là tạo một trang cấu hình thuộc tính. Những gì tôi thường làm là sử dụng tệp XML, giữ password/username ở một số định dạng encrypted. Bạn có thể dễ dàng phân tích cú pháp một số XML để truy xuất mật khẩu của mình để kết nối.

Điều này đảm bảo độ tin cậy mà mật khẩu của bạn có thể thay đổi bất kỳ lúc nào. Điều này không chỉ đề cập đến mật khẩu. nhưng bất kỳ dữ liệu nào bạn sử dụng, được định cấu hình theo thời gian.