2008-12-03 279 views
13

我們正在爲客戶端開發Java Web服務。有兩種可能的選擇:Java - 從配置文件加密/解密用戶名和密碼

  • 將加密的用戶名/密碼存儲在Web服務客戶端上。從配置中讀取。文件在客戶端,解密併發送。

  • 將加密的用戶名/密碼存儲在Web服務器上。從配置中讀取。文件在Web服務器上解密並在Web服務中使用。

Web服務使用用戶名/密碼訪問第三方應用程序。

客戶端已經具有提供此功能的類,但此方法涉及以明文方式發送用戶名/密碼(儘管在Intranet內)。他們更喜歡存儲信息。在網絡服務中,但並不真正想要支付他們已有的東西。 (安全性不是一個重要的考慮因素,因爲它只在其內部網中)。

所以我們需要Java中的一些簡單快捷的東西。

有什麼建議嗎?

服務器是Tomkat 5.5。 Web服務是Axis2。

  • 我們應該使用什麼加密/解密軟件包?
  • 關鍵商店呢?
  • 我們應該使用什麼配置機制?
  • 這會很容易部署嗎?

回答

18

正在內聯網當然沒有理由解僱安全。對信息造成的大部分損害是由內部人士承擔。看看被保護的東西的價值,並充分考慮安全性。

聽起來好像有一個第三方應用程序,您擁有一組憑據,以及一些客戶端在使用第三方應用程序時可以有效共享此標識。如果是這種情況,我建議採用以下方法。

不要在您的Web服務器之外分發第三方密碼。

要做到這一點最安全的方法是以交互方式將其提供給Web應用程序。這可能是ServletContextListener,它會在應用程序啓動時提示輸入密碼,或者在應用程序中提供一個頁面,以便管理員可以通過表單輸入密碼。密碼存儲在ServletContext中,用於驗證對第三方服務的請求。

降低安全性的方法是將密碼存儲在服務器的文件系統上,以便只有運行服務器的用戶才能讀取密碼。這依賴於服務器的文件系統權限進行保護。

嘗試在客戶端或服務器上存儲加密形式的密碼,只是向後退一步。試圖用另一個祕密保護祕密時,你陷入無限倒退。

另外,客戶端應該向服務器驗證自己。如果客戶端是交互式的,請讓用戶輸入密碼。然後服務器可以決定該用戶是否有權訪問第三方服務。如果客戶端不是交互式的,下一個最好的安全措施是使用文件系統權限來保護客戶端的密碼。

爲了保護客戶端的憑據,客戶端和Web服務器之間的通道應該使用SSL進行保護。在這裏,在Intranet上運行是有利的,因爲您可以在服務器上使用自簽名證書。

如果您將密碼存儲在文件中,請將它們自己放入文件中;它使得需要更仔細地管理權限,並且最大限度地減少了許多用戶編輯該文件並因此看到密碼的需要。

24

據我所知,爲了打電話給第三方網絡服務,您將密碼作爲純文本傳遞,並且不涉及安全證書。

然後,我會說最簡單的方法是以加密格式(通過java加密機制)存儲密碼,當加密/解密密鑰只是硬編碼在代碼中。

我肯定會將它存儲在服務器端(文件系統或數據庫),而不是在多個客戶端上分發和維護它。

這是怎麼會與「DES」加密工作:

// only the first 8 Bytes of the constructor argument are used 
// as material for generating the keySpec 
DESKeySpec keySpec = new DESKeySpec("YourSecr".getBytes("UTF8")); 
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); 
SecretKey key = keyFactory.generateSecret(keySpec); 
sun.misc.BASE64Encoder base64encoder = new BASE64Encoder(); 
sun.misc.BASE64Decoder base64decoder = new BASE64Decoder(); 
......... 

// ENCODE plainTextPassword String 
byte[] cleartext = plainTextPassword.getBytes("UTF8");  

Cipher cipher = Cipher.getInstance("DES"); // cipher is not thread safe 
cipher.init(Cipher.ENCRYPT_MODE, key); 
String encrypedPwd = base64encoder.encode(cipher.doFinal(cleartext)); 
// now you can store it 
...... 

// DECODE encryptedPwd String 
byte[] encrypedPwdBytes = base64decoder.decodeBuffer(encryptedPwd); 

Cipher cipher = Cipher.getInstance("DES");// cipher is not thread safe 
cipher.init(Cipher.DECRYPT_MODE, key); 
byte[] plainTextPwdBytes = (cipher.doFinal(encrypedPwdBytes)); 
+0

哪裏「你的密鑰短語」從何而來?如果該來源是安全的,爲什麼不使用它來保存實際的密碼? – erickson 2008-12-04 17:09:24