[英]Protect embedded password
我在 java 中有一個屬性文件,其中存儲了我的應用程序的所有信息,例如徽標圖像文件名、數據庫名稱、數據庫用戶和數據庫密碼。
我可以將加密的密碼存儲在屬性文件中。 但是,可以使用反編譯器從 jar 中讀取密鑰或密碼短語。
有沒有辦法將 db pass 安全地存儲在屬性文件中?
有多種方法可以管理這一點。 如果您能找到一種方法讓用戶在應用程序啟動時為密鑰庫提供密碼,那么最合適的方法是使用密鑰加密所有值,並將此密鑰存儲在密鑰庫中。 密鑰庫的命令行界面是使用 keytool。 然而,JSE 也有 API 以編程方式訪問密鑰庫。
如果您無法讓用戶在啟動時手動向密鑰庫提供密碼(例如對於 Web 應用程序),一種方法是編寫一個異常復雜的混淆例程,它可以混淆密鑰並將其存儲在還有一個屬性文件。 需要記住的重要事情是混淆和反混淆邏輯應該是多層的(可能涉及加擾、編碼、引入虛假字符等),並且本身應該至少有一個可以隱藏在應用程序中的其他類中的密鑰使用不直觀的名稱。 這不是一個完全安全的機制,因為有反編譯器和相當多的時間和智慧的人仍然可以解決它,但這是我所知道的唯一一個不需要你闖入本機(即不易反編譯)代碼的機制.
您將密碼的 SHA1 哈希值存儲在您的屬性文件中。 然后,當您驗證用戶密碼時,您會散列他們的登錄嘗試並確保兩個散列匹配。
這是將為您散列一些字節的代碼。 您可以使用getBytes()
方法輕松地從字符串中獲取字節。
/**
* Returns the hash value of the given chars
*
* Uses the default hash algorithm described above
*
* @param in
* the byte[] to hash
* @return a byte[] of hashed values
*/
public static byte[] getHashedBytes(byte[] in)
{
MessageDigest msg;
try
{
msg = MessageDigest.getInstance(hashingAlgorithmUsed);
}
catch (NoSuchAlgorithmException e)
{
throw new AssertionError("Someone chose to use a hashing algorithm that doesn't exist. Epic fail, go change it in the Util file. SHA(1) or MD5");
}
msg.update(in);
return msg.digest();
}
不,那里沒有。 即使你加密它,有人會反編譯解密它的代碼。
您可以為密碼(直接數據庫密碼或密鑰密碼)制作一個單獨的屬性文件(在 jar 之外),並且不包括該屬性文件與分發。 或者您可以讓服務器只接受來自特定機器的登錄,這樣就需要進行欺騙。
除了如上所述加密密碼之外,將任何密碼放在單獨的屬性文件中,並在部署時嘗試為該文件提供盡可能多的鎖定權限。
例如,如果您的應用程序服務器以root
身份在 Linux/Unix 上運行,則使root
擁有的密碼屬性文件具有 400/ -r--------
權限。
在以某種方式進行身份驗證后,您不能讓應用程序通過 https 聯系服務器並下載密碼嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.