2014-09-21 52 views
1

我已經實現了一個例程,當用戶提交表單時,一封電子郵件會發送給管理員。爲此,我使用了Java Mail API。我在Microsoft Outlook上設置了一個虛擬帳戶來發送電子郵件。在代碼中,我已經對密碼進行了硬編碼。我擔心這將是一個安全問題,當我主持的網頁。在Java Web應用程序中存儲密碼變量的不同方法?

這是我的代碼。

我寫了一個私有函數:

private void getSession(){ 
    this.session = Session.getDefaultInstance(properties, 
    new javax.mail.Authenticator() { 
     protected PasswordAuthentication 
     getPasswordAuthentication() { 
      return new PasswordAuthentication("[email protected]", "xxxxx_password_xxx"); 
     } 
    }); 
} 

在我的公開​​方法我稱之爲getSession()方法和產生的消息。

public String execute() throws Exception { 
    getSession(); 
    Message message = new MimeMessage(this.session); 
    message.setFrom(new InternetAddress("[email protected]")); 
    message.setRecipients(Message.RecipientType.TO, 
          InternetAddress.parse("[email protected]")); 
    message.setSubject("Form submit notification"); 
    //... 
} 

當我主持網頁時,在會話方法中硬編碼密碼是否安全?

如果沒有,那麼一些指針來實現替代方案。

謝謝!

+1

可能的重複檢查http://stackoverflow.com/questions/8195099/java-how-to-store-password-used-in-application – SoftwareCarpenter 2014-09-21 22:32:02

+1

可以從可執行文件中獲取字符串列表。因此,任何訪問該文件的人都可以獲取這些字符串並猜測密碼。 – cliff2310 2014-09-21 22:47:34

回答

3

在這種情況下,他不能散列密碼。密碼只有在需要CHECKED而沒有使用時才能被散列。使用密碼(即後端需要登錄到SMTP服務器才能發送電子郵件或到另一個數據庫以提取數據)意味着需要知道該密碼。

在這種情況下,有3 + 1層的替代品,基本上將不安全性從代碼轉移到其他地方。但攻擊者將始終能夠根據程序的相同前提條件恢復密碼。獲得他們的可能性衡量該密碼的安全級別。

  1. 在明文,在配置文件 - 密碼可以存儲在文件系統中的某處 配置文件;顯然,如果它是一個 Web應用程序,它不能是webroot,但在其他地方很好保護
  2. 在配置文件中加密;加密/解密密鑰必須存儲在 不同的文件中,而不是在代碼中。這種方法最適用於 這兩個文件存儲在不同的文件系統中
  3. 在配置文件中加密;在任何文件系統上,加密/解密密鑰都不會被存儲爲 。在啓動時向運營商詢問是否啓動應用程序 ;檢查該密鑰是否爲 正確的密鑰(否則,應用程序無法啓動),如果是,則將其 存儲在內存中。
  4. [不是普通人的真正替代品] HSM硬件安全模塊:這種類型的設備以「安全」方式存儲密鑰和值。這通常意味着服務器(您的 應用程序)具有一個PCI /硬件模塊,用於物理授予 連接並檢索存儲在HSM中的某些密鑰。用於解密配置文件的密鑰 存儲在HSM中,並且由於服務器連接具有PCI硬件的事實,因此 可以檢索該密鑰並解密配置文件。

這些解決方案

0--密碼在SRCS硬編碼的風險的耙 - >的風險被連接到容易性代碼的檢索;反編譯提取harcoded字符串是不是即使在C/C++困難,Java和.NET是瑣碎和即時

  1. 密碼在配置文件中,明文 - >風險連接到方便的檢索文件系統中的特定文件;通常這是很難的,因爲代碼在共享庫中存在,在不同的人之間共享,而承載應用的文件系統被更少的人訪問
  2. 配置文件中的密碼加密 - >風險是上面相同!我知道這聽起來很奇怪,但請相信我:用密鑰「close」加密或用明文加密的密碼是相同的!
  3. 配置文件中的密碼,已加密,未存儲密鑰 - >風險與讀取運行密碼的服務器中的內存的難易程度有關。在C/C++中,你需要是root AFAIK。在Java中,你可以將它作爲啓動該進程的同一用戶。在這兩種情況下,它都需要完全訪問系統
  4. 密碼在配置文件中加密,在HSM中鍵 - >您必須獲得對服務器的完全控制權,通常是root,然後瞭解哪個API的HSM必須檢索密鑰。它連接到完全訪問服務器的可能性。

當然,從1到3,實施變得更加困難。 4是HSM的API。

+0

關於使用單向散列身份驗證的好處。在我的回答中,我鏈接到解釋存儲密碼的最佳實踐的信息。 – SoftwareCarpenter 2014-09-22 10:21:08

2

這不是一個好的軟件實踐,可能導致安全問題。

當密碼更改時,它也可能導致問題出現。您將不得不重新編譯代碼才能更新應用程序。

下面是一種不需要硬編碼密碼的建議方法,因此可以讓您的軟件更加靈活和安全。

CWE-259: Use of Hard-coded Password

正如上面的鏈接提示: 應用強大的單向散列到您的密碼和這些哈希存儲在配置文件或數據庫與適當的訪問控制。這樣,盜竊文件/數據庫仍然需要攻擊者試圖破解密碼。在身份驗證期間接收到傳入的密碼時,請取出密碼的哈希值並將其與您保存的哈希值進行比較。

爲您生成的每個獨立哈希使用隨機分配的鹽。這增加了攻擊者進行暴力攻擊所需的計算量,可能限制了彩虹表方法的有效性。

+0

謝謝你的回覆!這些鏈接幫助我學習了很多有關確保我缺乏應用程序的知識。 – 2014-09-22 07:28:46

+0

很高興你找到你需要的東西。用戶sc0p答案還提供了一些有關風險/實施方法的良好信息。 – SoftwareCarpenter 2014-09-22 10:25:20

+0

爲什麼選擇投票?爲投票添加評論可能會導致更好的答案。 – SoftwareCarpenter 2015-07-27 19:09:49

相關問題