Overview
Hardcoded password 可能會削弱系統(tǒng)安全性,一旦出現(xiàn)安全問題將無法輕易修正。
Details
使用硬編碼方式處理密碼絕非好方法。這不僅是因為所有項目開發(fā)人員都可以使用通過硬編碼方式處理的密碼,而且還會使解決這一問題變得極其困難。在代碼投入使用之后,除非對軟件進行修補,否則將無法更改密碼。如果受密碼保護的帳戶遭受入侵,系統(tǒng)所有者將必須在安全性和可用性之間做出選擇。 在這種情況下,?getConnection() 的調(diào)用中發(fā)現(xiàn) Hardcoded Password。
例 1:以下代碼用 hardcoded password 來連接數(shù)據(jù)庫:
DriverManager.getConnection(url, "scott", "tiger");
該代碼可以正常運行,但是有權(quán)訪問該代碼的任何人都能得到這個密碼。一旦程序發(fā)布,除非修補該程序,否則可能無法更改數(shù)據(jù)庫用戶“scott”和密碼“tiger”。雇員可以利用手中掌握的信息訪問權(quán)限入侵系統(tǒng)。
更糟的是,如果攻擊者能夠訪問應用程序的字節(jié)代碼,那么他們就可以利用 javap -c 命令訪問已經(jīng)過反匯編的代碼,而這些代碼中恰恰包含用戶使用過的密碼值。此操作的結(jié)果可能類似于
Example 1 的以下內(nèi)容:
javap -c ConnMngr.class 22: ldc #36; //String
jdbc:mysql://ixne.com/rxsql 24: ldc #38; //String scott 26: ldc #17; //String tiger
在移動環(huán)境中,由于設備丟失的幾率較高,所以 password management 非常重要。
示例 2:以下代碼會使用硬編碼的用戶名和密碼設置用于通過 Android WebView 查看受保護頁面的身份驗證。 ...
webview.setWebViewClient(new WebViewClient()
{
public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
handler.proceed("guest", "allow");
}
}
);
... 與Example 1 類似,該代碼可以正常運行,但是有權(quán)訪問此代碼的任何人都可以獲得此密碼。
Recommendations
絕不能對密碼進行硬編碼。通常情況下,應對密碼進行模糊處理,并在外部資源文件中進行管理。在系統(tǒng)中的任何位置采用明文的形式存儲密碼,會造成任何有足夠權(quán)限的人均可讀取和無意中誤用密碼。至少,要對密碼進行散列處理后再存儲。 一些第三方產(chǎn)品聲稱可以安全地管理密碼。例如,WebSphere Application Server 4.x 用簡單的異或加密算法加密數(shù)值,但是請不要對諸如此類的加密方式給予完全的信任。
WebSphere 以及其他一些應用服務器通常都只提供過期的且相對較弱的加密機制,這對于對安全性要求較高的環(huán)境來說是遠遠不夠的。目前,最佳的安全且通用的解決方法是創(chuàng)建自己的專有機制。 對于 Android 以及其他任何使用 SQLite 數(shù)據(jù)庫的平臺來說,SQLCipher 是一個不錯的備選方案。SQLCipher 是對 SQLite 數(shù)據(jù)庫的擴展,為數(shù)據(jù)庫文件提供了透明的 256 位 AES 加密。因此,憑證可以存儲在加密的數(shù)據(jù)庫中。
示例 3:以下代碼演示了如何在下載必要的二進制文件后將 SQLCipher 集成到 Android 應用程序中,并將憑據(jù)存儲到數(shù)據(jù)庫文件中。文章來源:http://www.zghlxwxcb.cn/news/detail-812411.html
import net.sqlcipher.database.SQLiteDatabase;
SQLiteDatabase.loadLibs(this);
File dbFile = getDatabasePath("credentials.db");
dbFile.mkdirs();
dbFile.delete();
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbFile, "credentials", null); db.execSQL("create table credentials(u, p)");
db.execSQL("insert into credentials(u, p) values(?, ?)", new Object[]{username, password});
... 請注意,對 android.database.sqlite.SQLiteDatabase 的引用可以使用 net.sqlcipher.database.SQLiteDatabase 代替。 要在 WebView 存儲器上啟用加密,必須使用 sqlcipher.so 庫重新編譯 WebKit。文章來源地址http://www.zghlxwxcb.cn/news/detail-812411.html
到了這里,關于java開發(fā)安全之:Password Management: Hardcoded Password的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!