2016-08-23 56 views
9

當我瞄準API 18時,如何獲得下面的等效代碼?下面的代碼僅適用於API 23及以上版本。考慮到我們不能使用KeyGenParameterSpec並且API 18代碼可能使用不推薦的API,API 18代碼的安全性又如何?如何在API 18中使用Android KeyStore API?

KeyGenerator keyGenerator = KeyGenerator.getInstance(
    KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); 

keyGenerator.init(new KeyGenParameterSpec.Builder(alias, 
    KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) 
    .setBlockModes(KeyProperties.BLOCK_MODE_CBC) 
    .setKeySize(256) 
    .setUserAuthenticationRequired(true) 
    .setUserAuthenticationValidityDurationSeconds(400) 
    .setRandomizedEncryptionRequired(false) 
    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) 
    .build()); 

SecretKey key = keyGenerator.generateKey(); 

回答

5

從Android 6.0(API Level 23)開始支持Android KeyStore中的對稱密鑰生成和存儲。

從Android 4.3(API Level 18)開始支持Android KeyStore中的非對稱密鑰生成和存儲。

更多信息請參閱本文檔:Android Keystore System

雖然有一些問題,你可以使用非對稱密鑰的生成。按照參考波紋管..

Asymmetric Key Generation

+0

有沒有什麼建議可以API級別23的對稱密鑰之前產生什麼辦法? – Arst

0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
    KeyPairGenerator generator = KeyPairGenerator.getInstance(KEY_ALGORITHM_RSA, AndroidKeyStore); 
    generator.initialize(new KeyGenParameterSpec.Builder(
     Constants.SADAD_ENCRYPTION_ALIAS, 
     KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY) 
     .setDigests(
      KeyProperties.DIGEST_SHA256, 
      KeyProperties.DIGEST_SHA512) 
     .build() 
    ); 
    generator.generateKeyPair(); 
} else { 
    Calendar start = Calendar.getInstance(); 
    Calendar end = Calendar.getInstance(); 
    end.add(Calendar.YEAR, 1); 
    KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec 
     .Builder(SadadApplication.getInstance().getApplicationContext()) 
     .setAlias(Constants.SADAD_ENCRYPTION_ALIAS) 
     .setSubject(new X500Principal("CN=Your Company ," + 
      " O=Your Organization" + 
      " C=Your Coountry")) 
     .setSerialNumber(BigInteger.ONE) 
     .setStartDate(start.getTime()) 
     .setEndDate(end.getTime()) 
     .build(); 
    KeyPairGenerator generator = KeyPairGenerator.getInstance(KEY_ALGORITHM_RSA, AndroidKeyStore); 

    generator.initialize(spec); 
    generator.generateKeyPair(); 
} 
相關問題