2015-06-30 57 views
0

我想使用AndroidKeyStore爲了保存一個RSA密鑰對只有三星設備與棒棒糖。 我知道默認的Android實現有一個錯誤(https://code.google.com/p/android/issues/detail?id=61989),但它似乎在三星棒棒糖設備上已修復。但我看到另外兩種奇怪的行爲。 的RSA密鑰對使用以下代碼創建的:AndroidKeyStore奇怪的行爲

KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(ctx) 
      .setAlias(ALIAS) 
      .setSubject(
        new X500Principal(String.format("CN=%s, OU=%s", ALIAS, 
          ctx.getPackageName()))) 
      .setSerialNumber(BigInteger.ONE).setStartDate(notBefore.getTime()) 
      .setEndDate(notAfter.getTime()).build(); 

KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore"); 
kpGenerator.initialize(spec); 
kpGenerator.generateKeyPair(); 

這是打開密鑰庫

KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(ALIAS, null); 

if (keyEntry != null) { 
    return (RSAPrivateKey) keyEntry.getPrivateKey(); 
} 

問題N.1的代碼:在Android仿真器和一個的CyanogenMod 12.1設備密鑰存儲上在設備引導時解鎖,即使用戶沒有插入解鎖密碼 - 密碼 - 模式,我的測試應用程序可以訪問密鑰庫。在三星設備上,密鑰庫被鎖定,直到用戶第一次關閉鍵盤鎖。密鑰必須使用源自PIN或密碼的AES密鑰進行加密,且無需用戶交互,密鑰庫必須被鎖定

問題n.2:在所有設備上,即使未啓用安全鎖定屏幕,也可以插入密鑰對,而沒有任何警告,如操作系統的「您必須配置屏幕鎖定方法」。如上所述,密鑰必須加密,沒有屏幕鎖定,可能無法完成。

我的代碼有什麼問題?

+0

什麼設備是「所有設備」(設備和操作系統版本)? Samsung設備是否啓用了KNOX? – Robert

+0

「所有設備」的意思是所有三星設備與棒棒糖+一些三星與KK + LG與棒棒糖+模擬器與棒棒糖。諾克斯從未啓用 – Sarbyn

回答

0

@尼古拉 - elenkov建議我爲了加密在測試鍵使用KeyPairGeneratorSpec.Builder.setEncryptionRequired(),現在所有設備創建一個密鑰對,當要求一個安全的屏幕鎖,並在啓動時密鑰庫被鎖定,直到用戶插入Pin-Password-Pattern。現在可以了!像往常一樣感謝@ nikolay-elenkov

有趣的是,啓用了Lollipop和安全屏幕鎖的三星設備默認情況下啓用加密,而不使用setEncryptionRequired。這就是爲什麼我在「問題n.1」中看到奇怪的行爲......像往常一樣,「奇怪」的三星定製

+0

setEncryptionRequired僅適用於LOLLIPOP設備。在舊設備上(note3 neo使用android 4.4.2和S4 mini使用4.4.2)在KeyStore中加載密鑰對時會顯示一個彈出窗口,其中顯示「Enter password for credential storage」(密碼????)屏幕鎖定。但是,由於KitKat錯誤(https://code.google.com/p/android/issues/detail?id=61989)並不重要,我的解決方案僅適用於Android> 5.0 – Sarbyn