2012-07-25 41 views
14

Tôi rất mới trong khung công tác Spring và tôi đang sử dụng khung công tác Spring để quản lý các kết nối cơ sở dữ liệu của mình. Applicaiton đọc các tham số kết nối db của tôi từ một tệp thuộc tính. Điều tôi cần là lưu trữ mật khẩu kết nối của tôi trong tệp thuộc tính như được mã hóa. Đây là tập tin xml nguồn dữ liệu của tôiLàm thế nào để lưu trữ mật khẩu được mã hóa trong tập tin thuộc tính trong Spring

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> 

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="location"> 
      <value>file:${DBConfigFile}</value> 
     </property> 
    </bean> 

    <bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
     <property name="driverClass" value="${jdbc.driverClassName}" /> 
     <property name="jdbcUrl" value="${jdbc.url}" /> 
     <property name="user" value="${jdbc.username}" /> 
     <property name="password" value="${jdbc.password}" /> 
     <property name="initialPoolSize"><value>3</value></property> 
     <property name="minPoolSize"><value>3</value></property> 
     <property name="maxPoolSize"><value>50</value></property> 
     <property name="idleConnectionTestPeriod"><value>200</value></property> 
     <property name="acquireIncrement"><value>1</value></property> 
     <property name="maxStatements"><value>0</value></property> 
     <property name="numHelperThreads"><value>3</value></property> 
    </bean> 

</beans> 

Tôi thiking để viết mật khẩu mã hóa vào tập tin bất động sản và tôi tự hỏi nếu mùa xuân có thể giải mã nó với một thuật toán tự động. Có thể với cấu hình. Cảm ơn bạn trước.

Trả lời

1

Nó không có ý nghĩa gì, bởi vì nếu mùa xuân có thể giải mã nó, thì mọi người khác cũng có thể. Mã hóa này sẽ không tạo ra bất kỳ sự khác biệt nào, nó không bảo vệ bất cứ thứ gì. Nó chỉ mang lại điều nguy hiểm - cảm giác bảo vệ giả.

Có thể bạn có thể sử dụng một số cách khác để xác thực cơ sở dữ liệu, ví dụ: MS SQL server cho phép sử dụng Windows Security thay vì xác thực mật khẩu. Điều tương tự đối với Postgres (nó cho phép truy cập bằng tài khoản người dùng hoặc sử dụng chứng chỉ SSL).

+0

Bạn nói đúng nhưng tôi đề cập đến một thuật toán riêng của Spring chứ không phải công khai. Cảm ơn bạn đã trả lời, tôi sẽ tìm kiếm về chứng nhận ssl. – tace

+2

@tace Thuật toán riêng cho bảo mật là oxymoron. http://en.wikipedia.org/wiki/Security_through_obscurity. Vì vậy, một cách để làm cho nó đúng là sử dụng bảo vệ hệ thống hoạt động (Windows NTLM, Unix pam, vv), nó có thể cung cấp một số bảo vệ. – kan

+2

Với thông tin đăng nhập được mã hóa trong thuộc tính của bạn, bạn có thể giữ cho chúng được kiểm soát phiên bản (không cùng với khóa riêng) cùng với dịch vụ cần chúng và tự động triển khai khi triển khai dịch vụ. Điều duy nhất cần được duy trì bên ngoài đường ống triển khai là khóa riêng để giải mã các thuộc tính, điều này dễ bị lỗi hơn rất nhiều so với việc duy trì toàn bộ cấu hình bên ngoài vòng đời bình thường của dịch vụ. –

7

Xuân Theo tôi được biết không hỗ trợ khả năng này, nhưng một số dự án khác có thể hữu ích:

0

Bạn có thể viết một bean để giải mã mật khẩu của bạn và sau đó tiêm đậu vào bất cứ điều gì cần mật khẩu

+0

có cách nào để tiêm pom.xml không? – fiddle

5

Tôi đang sử dụng lò xo 4 và jasypt 1.9. Tài liệu Jasypt không cung cấp hỗ trợ rõ ràng cho mùa xuân 4. Tôi không thể định vị lớp có tên EncryptablePropertyPlaceholderConfigurer với phụ thuộc org.jasypt:jasypt:1.9.2.

Tôi đã viết một lớp Java tiện ích mã hóa tĩnh đơn giản (điều này sử dụng API jasypt).

public class EncryptionUtil { 
    static PooledPBEStringEncryptor encryptor = null; 
    static { 
     encryptor = new PooledPBEStringEncryptor(); 
     encryptor.setPoolSize(4); 
     // There are various approaches to pull this configuration via system level properties. 
     encryptor.setPassword("parashar"); 
     encryptor.setAlgorithm("PBEWITHMD5ANDDES"); 
    } 

    public static String encrypt(String input) { 
     return encryptor.encrypt(input); 
    } 

    public static String decrypt(String encryptedMessage) { 
     return encryptor.decrypt(encryptedMessage); 
    } 

} 

Tôi đã sử dụng tiện ích này để mã hóa mật khẩu tôi định lưu giữ trong các tệp thuộc tính của mình.

Tôi sau đó chỉ đơn giản là sử dụng EL mùa xuân để giải mã các thuộc tính trở lại trong cấu hình mùa xuân xml của tôi.

<property name="password" value="#{T(amit.parashar.EncryptionUtil).decrypt('${db.password}')}" /> 

EDIT: Để trả lời về cách ẩn các mật khẩu mã hóa:

Use system args while bringing up your java process. 

cho ví dụ: Java -Dwhatismyencpawd = "parashar"

và sử dụng nó như

encryptor.setPassword(java.lang.System.getProperty("whatismyencpawd")); 

Bằng cách này chỉ có quản trị ứng dụng sẽ biết mật khẩu. Mật khẩu theo cách này sẽ được hiển thị như một phần của lệnh ps mặc dù trên một hộp UNIX.

hoặc Bạn cũng có thể định cấu hình và đọc từ biến môi trường cấp hệ điều hành.

+0

Tôi không hiểu, bây giờ làm thế nào tôi sẽ bảo đảm "parashar" bởi vì nếu ai đó kiểm tra mã và họ có thể giải mã đúng không? –

+1

@Pasupathi Tôi đã cập nhật phản hồi của mình. –

0

Bạn có thể sử dụng encryption and decryption do cấu hình đám mây mùa xuân cung cấp

+0

OK, nhưng làm cách nào? Trang đó xuất hiện để mô tả cách sử dụng máy khách và máy chủ đám mây mùa xuân để nhận các thuộc tính đã được giải mã từ máy chủ cấu hình. Nhưng tôi không quan tâm đến việc duy trì một dịch vụ chỉ để xử lý các thuộc tính giải mã, vậy làm thế nào để tôi kéo cơ chế giải mã cho các thuộc tính vào một bối cảnh ứng dụng mùa xuân bình thường? – ideasculptor

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