2012-08-22 108 views
16

Keystore密碼的意義究竟是什麼,例如在JKS/BKS密鑰庫上?Java密鑰庫密碼毫無意義?

這顯然不是爲了安全,因爲我可以用編輯器打開文件並將所有條目複製到沒有密碼檢查的新文件中。受密碼保護的密鑰庫中的數據未加密!

此密碼保護什麼?它似乎只是針對開發人員oO ...

+0

沒有真正的方法可以在本地安全地存儲密碼並且可以訪問它們,除非您依賴於安全模式,或者請求用戶使用密碼來解鎖密碼存儲區。 – WhyNotHugo

+0

是的,但你想說什麼?我的私鑰是安全的,因爲它被KEYPAIR密碼加密和保護。所有其他內容可以以明文形式讀取,無論是否存在密鑰存儲密碼。 – billdoor

+1

的確,但您需要提供密碼才能訪問它;這是我的觀點。這同樣適用於密碼存儲;你仍然需要一個主密碼。 – WhyNotHugo

回答

4

在JKS或BKS密鑰庫上,密碼並非毫無意義,但它也不會做你可能會假設的事情。

它不會加密密鑰庫中的數據或以任何方式阻止對其進行訪問,但它確實會驗證密鑰庫的完整性。在不知道密碼的情況下,如果沒有找到正常用戶(通常是由於他們的工具告訴他們「密鑰庫被篡改或密碼不正確」),不可能對密鑰庫進行更改

在其他一些密鑰庫類型(如Keystore.BouncyCastle)密鑰庫密碼可以防止檢查以及篡改。

8

假設您在密鑰庫中保存了一個名爲「this is my sentence」的字符串,當您用記事本打開它時,您看到密文「blabla」,並且您將「blabla」複製到另一個文件並聲明您找到純文本,並且它是「blabla」,這顯然不正確,但您仍然不知道原始的pliant-ext,直到通過密碼恢復爲止。

== ==編輯

爲JKS密鑰庫,密鑰庫密碼是用來驗證完整性, src

636 if (password != null) { 
637  md = getPreKeyedHash(password); 
638  dis = new DataInputStream(new DigestInputStream(stream, md)); 
639 } 

的DigestInputStream生成一個簽名並把它比作一個acutal,看是否是改性。

BouncyCastle的密鑰庫UBER是更安全的,整個密鑰庫是基於SHA1和Twofish的加密與PBE(PBEWithSHAAndTwofish-CBC)

 Cipher cipher = this.makePBECipher(cipherAlg, Cipher.DECRYPT_MODE, password, salt, iterationCount); 
     CipherInputStream cIn = new CipherInputStream(dIn, cipher); 

     Digest dig = new SHA1Digest(); 
     DigestInputStream dgIn = new DigestInputStream(cIn, dig); 

     this.loadStore(dgIn); 
+0

我剛剛將certificateData從密鑰庫中複製到一個crt文件中,它可以工作。當然,我無法訪問受密碼保護的密鑰對,而是使用密鑰對密碼進行加密,而不是使用密鑰庫 – billdoor

+1

公鑰是公開的,它不是敏感數據 –

+1

但是密鑰庫密碼的目的是什麼?我遇到了密鑰對密碼保護密鑰對,但密鑰庫中的哪些信息受密鑰庫密碼保護? – gkuzmin

-1

的JKS密鑰是二進制存儲和它的內容所使用的密碼加密的作爲一個關鍵。沒有人可以訪問沒有密碼的內容。密碼用於保護商店內容免遭非法訪問和操作。您可以確保在某個編輯器中打開加密的內容,但無法理解。

+0

似乎是有道理的,但我可以訪問的內容(並有意義) – billdoor

+1

你不能得到一個可用的數據。密碼保護還可以防止商店的操作。 – Drona

+1

另一次:我得到可用的數據,但防止操作的密鑰庫!謝謝! – billdoor