java get key_java – KeyStore getKey()在Android中返回null

我正在使用此代码将密钥存储到

Android App中的KeyStore中:

SecretKeyFactory kf = SecretKeyFactory.getInstance("DES");

DESKeySpec keySpec = new DESKeySpec(key); // byte[] key

SecretKey skey = kf.generateSecret(keySpec);

KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());

ks.load(null, "ksPassword".toCharArray());

PasswordProtection pass = new PasswordProtection(

"entryPassword".toCharArray());

KeyStore.SecretKeyEntry skEntry = new KeyStore.SecretKeyEntry(skey);

ks.setEntry("keyAlias", skEntry, pass);

FileOutputStream fos = ctx.getApplicationContext().openFileOutput("bs.keystore",

Context.MODE_PRIVATE);

ks.store(fos, ksPassword);

fos.close();

然后,在另一种方法中,我使用此代码来检索我存储的密钥,

FileInputStream fis = ctx.getApplicationContext().openFileInput("bs.keystore");

KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());

ks.load(fis, "ksPassword".toCharArray());

Key k = (SecretKey) ks.getKey(keyAlias, "entryPassword".toCharArray());

fis.close();

但是指令ks.getKey(“keyAlias”,“entryPassword”.toCharArray())返回null.

我哪里错了?

当将密钥存储在Android Keystore时,以下是一些示例代码: 1. 生成AES密钥: ```java KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); keyGenerator.init(new KeyGenParameterSpec.Builder(keyAlias, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) .setBlockModes(KeyProperties.BLOCK_MODE_CBC) .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) .setUserAuthenticationRequired(true) // 需要用户验证 .build()); SecretKey secretKey = keyGenerator.generateKey(); ``` 2. 加载KeyStore: ```java KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); ``` 3. 生成并存储密钥对: ```java KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore"); keyPairGenerator.initialize(new KeyGenParameterSpec.Builder(keyAlias, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1) .setUserAuthenticationRequired(true) // 需要用户验证 .build()); KeyPair keyPair = keyPairGenerator.generateKeyPair(); ``` 4. 使用密钥: ```java PrivateKey privateKey = (PrivateKey) keyStore.getKey(keyAlias, null); PublicKey publicKey = keyStore.getCertificate(keyAlias).getPublicKey(); // 使用私钥进行加密 Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.ENCRYPT_MODE, privateKey); byte[] encryptedData = cipher.doFinal(data); // 使用公钥进行解密 Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.DECRYPT_MODE, publicKey); byte[] decryptedData = cipher.doFinal(encryptedData); ``` 请注意,以上代码仅为示例,您需要根据自己的需求进行修改和适配。确保密钥别名(keyAlias)是唯一且安全的,并在必要时处理异常。此外,代码的用户验证(User Authentication)部分可以根据您的需求进行调整。 希望这些代码能够帮助您在Android应用程序将密钥存储在Android Keystore
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值