我以可以使用AndroidKeyStore保护任意数据块为前提,并将其称为“键”。 但是,我研究得越深,就越清楚地看到KeyStore API与与安全性相关的对象(证书,密钥规格,提供程序等)深深地纠缠在一起。它不是设计来存储任意数据的,我看不到任何简单的方法 为此而弯曲的道路。

但是,可以使用AndroidKeyStore帮助我保护敏感数据。 我可以使用它来管理加密密钥,该密钥将用于加密应用程序本地的数据。 通过结合使用AndroidKeyStore,CipherOutputStream和CipherInputStream,我们可以:

生成,安全地存储和检索设备上的加密密钥

加密任意数据并将其保存在设备上(在应用程序的目录中,该位置将受到文件系统权限的进一步保护)

访问和解密数据以备后用。

这是一些示例代码,演示了如何实现此目的。

try {

KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");

keyStore.load(null);

String alias = "key3";

int nBefore = keyStore.size();

// Create the keys if necessary

if (!keyStore.containsAlias(alias)) {

Calendar notBefore = Calendar.getInstance();

Calendar notAfter = Calendar.getInstance();

notAfter.add(Calendar.YEAR, 1);

KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(this)

.setAlias(alias)

.setKeyType("RSA")

.setKeySize(2048)

.setSubject(new X500Principal("CN=test"))

.setSerialNumber(BigInteger.ONE)

.setStartDate(notBefore.getTime())

.setEndDate(notAfter.getTime())

.build();

KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");

generator.initialize(spec);

KeyPair keyPair = generator.generateKeyPair();

}

int nAfter = keyStore.size();

Log.v(TAG, "Before = " + nBefore + " After = " + nAfter);

// Retrieve the keys

KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(alias, null);

RSAPrivateKey privateKey = (RSAPrivateKey) privateKeyEntry.getPrivateKey();

RSAPublicKey publicKey = (RSAPublicKey) privateKeyEntry.getCertificate().getPublicKey();

Log.v(TAG, "private key = " + privateKey.toString());

Log.v(TAG, "public key = " + publicKey.toString());

// Encrypt the text

String plainText = "This text is supposed to be a secret!";

String dataDirectory = getApplicationInfo().dataDir;

String filesDirectory = getFilesDir().getAbsolutePath();

String encryptedDataFilePath = filesDirectory + File.separator + "keep_yer_secrets_here";

Log.v(TAG, "plainText = " + plainText);

Log.v(TAG, "dataDirectory = " + dataDirectory);

Log.v(TAG, "filesDirectory = " + filesDirectory);

Log.v(TAG, "encryptedDataFilePath = " + encryptedDataFilePath);

Cipher inCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidOpenSSL");

inCipher.init(Cipher.ENCRYPT_MODE, publicKey);

Cipher outCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidOpenSSL");

outCipher.init(Cipher.DECRYPT_MODE, privateKey);

CipherOutputStream cipherOutputStream =

new CipherOutputStream(

new FileOutputStream(encryptedDataFilePath), inCipher);

cipherOutputStream.write(plainText.getBytes("UTF-8"));

cipherOutputStream.close();

CipherInputStream cipherInputStream =

new CipherInputStream(new FileInputStream(encryptedDataFilePath),

outCipher);

byte [] roundTrippedBytes = new byte[1000]; // TODO: dynamically resize as we get more data

int index = 0;

int nextByte;

while ((nextByte = cipherInputStream.read()) != -1) {

roundTrippedBytes[index] = (byte)nextByte;

index++;

}

String roundTrippedString = new String(roundTrippedBytes, 0, index, "UTF-8");

Log.v(TAG, "round tripped string = " + roundTrippedString);

} catch (NoSuchAlgorithmException e) {

Log.e(TAG, Log.getStackTraceString(e));

} catch (NoSuchProviderException e) {

Log.e(TAG, Log.getStackTraceString(e));

} catch (InvalidAlgorithmParameterException e) {

Log.e(TAG, Log.getStackTraceString(e));

} catch (KeyStoreException e) {

Log.e(TAG, Log.getStackTraceString(e));

} catch (CertificateException e) {

Log.e(TAG, Log.getStackTraceString(e));

} catch (IOException e) {

Log.e(TAG, Log.getStackTraceString(e));

} catch (UnrecoverableEntryException e) {

Log.e(TAG, Log.getStackTraceString(e));

} catch (NoSuchPaddingException e) {

Log.e(TAG, Log.getStackTraceString(e));

} catch (InvalidKeyException e) {

Log.e(TAG, Log.getStackTraceString(e));

} catch (BadPaddingException e) {

Log.e(TAG, Log.getStackTraceString(e));

} catch (IllegalBlockSizeException e) {

Log.e(TAG, Log.getStackTraceString(e));

} catch (UnsupportedOperationException e) {

Log.e(TAG, Log.getStackTraceString(e));

}

android keystore作用,如何使用Android KeyStore安全地存储任意字符串?相关推荐

  1. settext 在android的作用,setText在android中不起作用

    我有这个代码在相应的数据库中添加数据. public class RegisterActivity extends Activity implements OnClickListener { SQLi ...

  2. android keystore作用,Android KeyStore理解及簽名

    Android簽名概述 我們已經知道的是:Android對每一個Apk文件都會進行簽名,在Apk文件安裝時,系統會對其簽名信息進行比對,判斷程序的完整性,從而決定該Apk文件是否可以安裝,在一定程度上 ...

  3. android sdk 如何重新生成debug.keystore

    1)首先你要确定你安装的JDK位置,Windows->Preferences->Java->Installed JREs,你可以看到是Jre的location,再在dos cmd模式 ...

  4. Android:如何生成自己的keystore(zz)

    keystore不设置的话默认使用的是C:\Users\Fly\.Android下面的debug.keystore,每台电脑的都不一样,所以导致了无法安装的情况. 如何生成自己的keystore呢?这 ...

  5. android 生成debug.keystore,android sdk 如何重新生成debug.keystore

    1)首先你要确定你安装的JDK位置,Windows->Preferences->Java->Installed JREs,你可以看到是Jre的location,再在dos cmd模式 ...

  6. android商店账号密码错误,android app 自定义签名出现错误:Keystore was tampered with, or password was incorrect...

    android项目能够成功签名打包,并生成keystore.但是在导入是出现错误,如下图所示: 忘了说明一点,此项目是为了实现安卓项目下微信分享功能. 没人知道吗?那么有没有一个demo作参考呀?请大 ...

  7. android studio密钥库口令,Android应用开发Android Studio签名打包及根据keystore密钥获取SHA1安全码...

    本文将带你了解Android应用开发Android Studio签名打包及根据keystore密钥获取SHA1安全码,希望本文对大家学Android有所帮助. " 一.签名打包两种方式 1. ...

  8. Android JNI作用及其详解

    Android JNI作用及其详解 Java Native Interface (JNI)标准是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 J ...

  9. android:sharedUserId作用

    前言 Android给每个APK进程分配一个单独的空间,manifest中的userid就是对应一个分配的Linux用户ID,并且为它创建一个沙箱,以防止影响其他应用程序(或者被其他应用程序影响). ...

最新文章

  1. SpringBoot实战(四)之使用JDBC和Spring访问数据库
  2. “中台不就是微服务吗?有啥区别?”
  3. 微服务实战(五):落地微服务架构到直销系统(构建高性能大并发系统)
  4. python 创建以列表为元素的列表
  5. 取消一个正在执行的异步回发
  6. 云服务远程登录---设置安全组
  7. JVM性能调优监控工具
  8. python发展至今有哪些版本_Python发展至今有哪些版本,各版本有什么区别?
  9. 公布几个设备的sysObjectId取值
  10. 三、数字图像处理之直方图规定化实例
  11. python中关于object和type的个人理解
  12. Adobe Photoshop CS5永久序列号
  13. 运行java程序需要的工具软件的目录,运行Java程序需要的工具软件所在的目录是A.JDK的bin目录B.JDK的demo目录C.JDK的lib目录D.JDKR的j...
  14. python_循环语句for_1.12
  15. 基于cobra的go语言命令行解析器
  16. HTML实现公告文字滚动效果
  17. Hadoop —— 漫画图解hdfs读、写、容错、副本机制
  18. 渗透测试 对头像上传漏洞检测与修复
  19. Python实现图片添加水印(支持中文、英文和图片)
  20. shader实现星空效果

热门文章

  1. vs 调用matlab引擎,vs2010 matlab混合编程调用matlab引擎
  2. 过拟合解决方法python_机器学习之过拟合的风险
  3. css的animation动画
  4. Idea搭建一个JavaWeb项目(一)
  5. 简明python教程怎么买-简明python教程在哪买!《简明python教程》 下载地址?
  6. android tmp目录权限不够,/tmp目录下执行脚本失败提示Permission denied
  7. java必学_Java基础系列之初识JAVA
  8. 2018春考计算机技能考试题目,2018年山东省春季高考技能考试信息技术类专业考试(样题).PDF...
  9. OpenShift 4 - Service Mesh环境和BookInfo应用安装脚本
  10. OpenShift 4 之使用https协议访问Route