Android KeyStore总结
来源:互联网 发布:手机身份证读取软件 编辑:程序博客网 时间:2024/06/11 16:23
官方文档:https://developer.android.com/training/articles/keystore.html#UsingAndroidKeyStore
一、Android KeyStore的应用
1、存储密匙:Android提供的这个KeyStore最大的作用就是不需要开发者去维护这个密匙的存储问题,相比起存储在用户的数据空间或者是外部存储器都更加安全。注意的是这个密匙随着用户清除数据或者卸载应用都会被清除掉。
3、对称加密算法生成密匙与获取,注意这个alias是keystore存储该密匙的别名,通过这个别名可以获取这个密匙的相关数据。相关代码如下:
一、Android KeyStore的应用
1、存储密匙:Android提供的这个KeyStore最大的作用就是不需要开发者去维护这个密匙的存储问题,相比起存储在用户的数据空间或者是外部存储器都更加安全。注意的是这个密匙随着用户清除数据或者卸载应用都会被清除掉。
2、得益于Android独立的一套密匙库系统,可以提高安全性
二、实例:
1、前提:Android安全相关特性是从Android6.0开始有较大的改动,而KeyStore就是一个很好的体现,很多新特性(如KeyGenParameterSpec)都是从6.0才开始加入的,因此对于低版本应用需要做另外的兼容。
2、初始化KeyStore,代码如下
public void initKeyStore() { try { keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); } catch (KeyStoreException e) { e.printStackTrace(); } catch (CertificateException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
3、对称加密算法生成密匙与获取,注意这个alias是keystore存储该密匙的别名,通过这个别名可以获取这个密匙的相关数据。相关代码如下:
public void createSecretKey(String alias) { if (hasAlias(alias)) { return; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { try { KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); try { //AES算法用于加密与解密,具体参考KeyGenParameterSpec类注释 keyGenerator.init(new KeyGenParameterSpec.Builder(alias, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT).setBlockModes(KeyProperties.BLOCK_MODE_GCM) .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE).build()); } catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); } SecretKey key = keyGenerator.generateKey(); Log.d(TAG, "SecretKey:" + key); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchProviderException e) { e.printStackTrace(); } } }
public SecretKey getSecretKey(String alias) { try { SecretKey secretKey = (SecretKey) keyStore.getKey(alias, null); Log.d(TAG, "SecretKey:" + secretKey); return secretKey; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (UnrecoverableEntryException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace(); } return null; }
private boolean hasAlias(String alias) { try { return keyStore != null && keyStore.containsAlias(alias); } catch (KeyStoreException e) { e.printStackTrace(); } return false; }4、非对称加密算法密匙对的生成与获取,代码如下:
public void createKeyPair(String alias) { if (hasAlias(alias)) { return; } KeyPairGenerator keyPairGenerator; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { try { keyPairGenerator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore"); //RSA算法用于签名与校验,具体参考KeyGenParameterSpec类注释 keyPairGenerator.initialize(new KeyGenParameterSpec.Builder(alias, KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY).setDigests(KeyProperties.DIGEST_SHA256, KeyProperties .DIGEST_SHA512).build()); KeyPair keyPair = keyPairGenerator.generateKeyPair(); Log.d(TAG, "createKeyPair>>PrivateKey:" + keyPair.getPrivate() + ",PublicKey:" + keyPair.getPublic()); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); } catch (NoSuchProviderException e) { e.printStackTrace(); } } }
public KeyPair getTargetKeyPair(String alias) { try { KeyStore.PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(alias, null); PublicKey publicKey = entry.getCertificate().getPublicKey(); PrivateKey privateKey = entry.getPrivateKey(); Log.d(TAG, "getTargetKeyPair>>privateKey:" + privateKey + ",publicKey:" + publicKey); return new KeyPair(publicKey, privateKey); } catch (KeyStoreException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (UnrecoverableKeyException e) { e.printStackTrace(); } catch (UnrecoverableEntryException e) { e.printStackTrace(); } return null; }5、测试实例,代码如下
public void printAliases() { try { Enumeration<String> aliases = keyStore.aliases(); while (aliases != null && aliases.hasMoreElements()) { String alias = aliases.nextElement(); Log.d(TAG, "aliases:" + alias); } } catch (KeyStoreException e) { e.printStackTrace(); } }
public static void test() { KeyStoreHelper helper = new KeyStoreHelper(); helper.initKeyStore(); helper.printAliases(); String aesAlias = "hello aes key"; helper.createSecretKey(aesAlias); helper.getSecretKey(aesAlias); helper.printAliases(); String rsaAlias = "hello rsa key"; helper.createKeyPair(rsaAlias); helper.getTargetKeyPair(rsaAlias); helper.printAliases(); }
阅读全文
0 0
- Android KeyStore总结
- android keystore
- android keystore
- android keystore
- keystore制作过程总结
- Android Studio 默认keystore 以及自定义keystore
- android生成keystore 和dedug.keystore
- 【Android Studio】 默认keystore 以及自定义keystore
- Android Studio 默认keystore 以及自定义keystore
- Android Studio 默认keystore 以及自定义keystore
- Android Studio 默认keystore 以及自定义keystore
- Android Studio 默认keystore 以及自定义keystore
- Android Studio 默认keystore 以及自定义keystore
- Android Studio 默认keystore 以及自定义keystore
- android debug.keystore
- android keystore的使用
- android keystore的生成
- android keystore的使用
- css 清除浮动
- 《计算机图形学》学习笔记(一)
- 杭电acm 4857逃生(拓扑排序)
- Centos 7.3 Install gitlab 9.2
- 高精度大数求幂
- Android KeyStore总结
- C与C++结构体的区别
- 前端构建工具gulp
- 激光SLAM导航系列(五)局部路径规划
- 方法重载与方法重写
- 年年最最难就业季
- Linux shell脚本功略第2版笔记--第四章
- poj 2794 Double Patience(状态dp)
- C语言数据类型