Câu hỏi Làm thế nào để kết nối với cơ sở dữ liệu yêu cầu mật khẩu mà không cần lộ mật khẩu?


Tôi đang tạo một ứng dụng và tôi cần kết nối với cơ sở dữ liệu. Cơ sở dữ liệu yêu cầu đăng nhập / mật khẩu để ứng dụng có thể thực hiện các thao tác như chọn và chèn.

Trong ứng dụng tôi cần phải kết nối với cơ sở dữ liệu bằng cách sử dụng đăng nhập và mật khẩu, do đó, ứng dụng được tự do thực hiện một số tác vụ trên cơ sở dữ liệu. Câu hỏi của tôi là: làm cách nào để lưu trữ và sử dụng mật khẩu để kết nối với cơ sở dữ liệu mà không cần lộ mật khẩu? 

Tôi không thể đơn giản sử dụng một băm hoặc mã hóa để lưu trữ mật khẩu vì cơ sở dữ liệu phải nhận ra mật khẩu (Tôi nghĩ hầu hết hoặc tất cả các cơ sở dữ liệu phải nhận mật khẩu dưới dạng văn bản thuần túy).

.

.

Lưu ý: Kết nối được thực hiện bởi ứng dụng. Không có đầu vào của con người để thực hiện kết nối.

(Chỉnh sửa) Thông tin thêm về ứng dụng: nó là một ứng dụng web sử dụng servlets / jsp. Cơ sở dữ liệu nằm trên cùng một máy chủ của ứng dụng. Người dùng cho ứng dụng là người dùng mặc định không có quyền quản trị đầy đủ, nhưng nó có thể chèn / xóa các hàng và thực hiện hầu hết mọi thứ liên quan đến truy vấn và sửa đổi dữ liệu trong bảng.


13
2018-06-19 01:02


gốc


Bạn có thể nhắc một nhà điều hành cho một mật khẩu khi khởi động ứng dụng không? - sarnold
Kết nối được thực hiện bởi ứng dụng. Không có đầu vào của con người. - ceklock
Tôi nghĩ bạn cần mô tả một chút về môi trường của ứng dụng của bạn. Đây có phải là ứng dụng máy chủ, ứng dụng khách, là cơ sở dữ liệu trên cùng một máy chủ, máy chủ khác nhau không? Bạn đã tạo người dùng chỉ có quyền để chèn? (Bạn không cố gắng đăng nhập bằng root?) Nói chung, bạn phải 'cung cấp một số thông tin' và hạn chế quyền truy cập đăng nhập vào phạm vi ip.


Các câu trả lời:


Cách thông thường này được thực hiện là để bên ngoài tên người dùng / mật khẩu cho một tệp thuộc tính / cấu hình được đọc khi chạy (cho dù bạn có sử dụng nguồn dữ liệu JDBC / JNDI / CDI / J2EE nguyên gốc / etc) hay không.

Tệp được bảo vệ thông qua bảo mật O / S bởi các hệ thống quản trị hệ thống.

O / S có các công cụ tốt hơn để bảo vệ hơn mã ứng dụng.


10
2018-06-19 01:05



Cách truy cập tệp này? Nó có được mã hóa không? Phải giải mã mật khẩu? Làm cách nào để chuyển mật khẩu tới kết nối cơ sở dữ liệu? - ceklock
không chắc chắn cách bảo mật trong các ứng dụng của khách hàng (trong đó mật khẩu đang ở đâu trên dây)? Chăm sóc để khai thác .... - Mitch Wheat
Nếu bạn muốn ngăn người nào đó nhìn qua vai và nhìn thấy mật khẩu khi bạn đang chỉnh sửa tệp cấu hình, bạn có thể sử dụng stringScrambler trong Thư viện trợ giúp của Java. Nó thực sự đơn giản, nhưng thực sự hiệu quả để ngăn chặn mọi người từ vai lướt mật khẩu của bạn ... - kentcdodds
@tecnotron Tệp này là văn bản thuần túy. Tôi đã thấy điều này được thực hiện nhiều lần trên các trang web và máy chủ thương mại lớn. Tệp này an toàn vì các hệ thống quản trị không cho phép bất kỳ ai ở gần hệ thống tệp, do đó, nó an toàn (và dễ dàng hơn nhiều) để ở dạng văn bản thuần túy. Bạn có thể mã hóa nếu bạn muốn, nhưng bất cứ điều gì có thể được cracked với đủ thời gian và CPU, do đó, nó không phải là "an toàn" nếu mọi người có quyền truy cập vào tập tin. Bạn cần phải ngăn chặn truy cập vào tập tin ngoại trừ bởi sysadmin và quá trình chạy java. - Bohemian♦
@Bohemian - Bạn cho phép truy cập đồng thời cho nhiều người dùng vào tệp thuộc tính này như thế nào? - dwjohnston


Bạn nên sử dụng một tập tin cấu hình cho việc này. sử dụng spring với JDBC để làm cho cuộc sống của bạn dễ dàng hơn!

http://www.youtube.com/watch?v=f-k823MZ02Q

Kiểm tra hướng dẫn tuyệt vời ở trên trên khung công tác Spring và sử dụng JDBC. Xem tất cả các hướng dẫn mùa xuân và JDBC của anh ấy. BTW, ông bao gồm làm thế nào để lưu trữ mật khẩu trong tập tin cấu hình và dây hạt vv .. Hy vọng điều này sẽ giúp.


7
2018-06-19 02:13



Đó là một loạt các hướng dẫn tuyệt vời, nhưng hướng dẫn được liên kết không bao gồm việc xử lý mật khẩu. - dwjohnston


Bạn có thể dùng jasypt để mã hóa. Và lưu trữ tên người dùng và mật khẩu vào tệp datasource.properties.

public Connection getConnection() throws IOException{
    try{
        BasicTextEncryptor encryptor = new BasicTextEncryptor();
        encryptor.setPassword("jasypt");

        Properties props = new EncryptableProperties(encryptor);
        props.load( this.getClass().getResourceAsStream("datasource.properties") );

        String driver = props.getProperty("datasource.driver");
        String url = props.getProperty("datasource.url");        
        String userName = props.getProperty("datasource.userName");          
        String password = props.getProperty("datasource.password");

        Class.forName(driver);
        Connection conn = DriverManager.getConnection(url, userName, password);
        conn.setAutoCommit(false);

        return conn;
    } catch(ClassNotFoundException e) {
        e.printStackTrace();
        return null;

    } catch(SQLException e) {
        e.printStackTrace();
        return null;
    }
}

6
2018-06-19 01:17



Rất vui khi biết thư viện jasypt. Bạn có biết liệu quá trình mã hóa / giải mã có an toàn không? Trước tiên tôi sẽ lưu trữ trong một tập tin tất cả các mật khẩu được mã hóa mà tôi cần, và sau đó cố gắng giải mã các mật khẩu (giải mã là vấn đề, bởi vì tôi nghĩ rằng tôi sẽ cần mật khẩu khác ...). Nhưng có vẻ như bạn không cần giải mã bất kỳ thứ gì với thư viện này. Nếu nó hoạt động thì rất tốt. - ceklock
Jasypt cung cấp các kỹ thuật mã hóa một chiều và hai hướng. Tôi vừa sử dụng thư viện cho chuỗi kết nối. jasypt.org/features.html - JR Galia


Nếu đó là một ứng dụng web, triển khai nó trên một máy chủ ứng dụng Java EE và kết nối bằng cách sử dụng một tài nguyên JNDI. Chỉ quản trị viên đã thiết lập tài nguyên dữ liệu JNDI cần biết về thông tin đăng nhập cần thiết để kết nối. Người dùng và nhà phát triển thậm chí không phải biết họ; chỉ là tên tra cứu JNDI.

Không thể loại bỏ hoàn toàn nhu cầu của ai đó ngoài chủ sở hữu cơ sở dữ liệu để biết tên người dùng và mật khẩu, nhưng có thể hạn chế kiến ​​thức đó đối với chủ sở hữu máy chủ ứng dụng.

Bạn cũng được khuyên nên tạo các thông tin riêng biệt chỉ dành cho ứng dụng đó và cấp cho nó quyền truy cập và quyền tối thiểu cần thiết để hoàn thành nhiệm vụ của mình. Không nên có kiến ​​thức về các bảng hệ thống hoặc bất kỳ tài nguyên nào khác ngoài tỉnh của ứng dụng. NẾU DELETE quyền là không cần thiết, không cấp nó. Nếu truy cập chỉ nên được đọc, đó là những gì bạn nên GRANT cho thông tin xác thực đó.


5
2018-06-19 01:04