android keystore作用,如何使用Android KeyStore安全地存储任意字符串?
我以可以使用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安全地存储任意字符串?相关推荐
- settext 在android的作用,setText在android中不起作用
我有这个代码在相应的数据库中添加数据. public class RegisterActivity extends Activity implements OnClickListener { SQLi ...
- android keystore作用,Android KeyStore理解及簽名
Android簽名概述 我們已經知道的是:Android對每一個Apk文件都會進行簽名,在Apk文件安裝時,系統會對其簽名信息進行比對,判斷程序的完整性,從而決定該Apk文件是否可以安裝,在一定程度上 ...
- android sdk 如何重新生成debug.keystore
1)首先你要确定你安装的JDK位置,Windows->Preferences->Java->Installed JREs,你可以看到是Jre的location,再在dos cmd模式 ...
- Android:如何生成自己的keystore(zz)
keystore不设置的话默认使用的是C:\Users\Fly\.Android下面的debug.keystore,每台电脑的都不一样,所以导致了无法安装的情况. 如何生成自己的keystore呢?这 ...
- android 生成debug.keystore,android sdk 如何重新生成debug.keystore
1)首先你要确定你安装的JDK位置,Windows->Preferences->Java->Installed JREs,你可以看到是Jre的location,再在dos cmd模式 ...
- android商店账号密码错误,android app 自定义签名出现错误:Keystore was tampered with, or password was incorrect...
android项目能够成功签名打包,并生成keystore.但是在导入是出现错误,如下图所示: 忘了说明一点,此项目是为了实现安卓项目下微信分享功能. 没人知道吗?那么有没有一个demo作参考呀?请大 ...
- android studio密钥库口令,Android应用开发Android Studio签名打包及根据keystore密钥获取SHA1安全码...
本文将带你了解Android应用开发Android Studio签名打包及根据keystore密钥获取SHA1安全码,希望本文对大家学Android有所帮助. " 一.签名打包两种方式 1. ...
- Android JNI作用及其详解
Android JNI作用及其详解 Java Native Interface (JNI)标准是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 J ...
- android:sharedUserId作用
前言 Android给每个APK进程分配一个单独的空间,manifest中的userid就是对应一个分配的Linux用户ID,并且为它创建一个沙箱,以防止影响其他应用程序(或者被其他应用程序影响). ...
最新文章
- SpringBoot实战(四)之使用JDBC和Spring访问数据库
- “中台不就是微服务吗?有啥区别?”
- 微服务实战(五):落地微服务架构到直销系统(构建高性能大并发系统)
- python 创建以列表为元素的列表
- 取消一个正在执行的异步回发
- 云服务远程登录---设置安全组
- JVM性能调优监控工具
- python发展至今有哪些版本_Python发展至今有哪些版本,各版本有什么区别?
- 公布几个设备的sysObjectId取值
- 三、数字图像处理之直方图规定化实例
- python中关于object和type的个人理解
- Adobe Photoshop CS5永久序列号
- 运行java程序需要的工具软件的目录,运行Java程序需要的工具软件所在的目录是A.JDK的bin目录B.JDK的demo目录C.JDK的lib目录D.JDKR的j...
- python_循环语句for_1.12
- 基于cobra的go语言命令行解析器
- HTML实现公告文字滚动效果
- Hadoop —— 漫画图解hdfs读、写、容错、副本机制
- 渗透测试 对头像上传漏洞检测与修复
- Python实现图片添加水印(支持中文、英文和图片)
- shader实现星空效果
热门文章
- vs 调用matlab引擎,vs2010 matlab混合编程调用matlab引擎
- 过拟合解决方法python_机器学习之过拟合的风险
- css的animation动画
- Idea搭建一个JavaWeb项目(一)
- 简明python教程怎么买-简明python教程在哪买!《简明python教程》 下载地址?
- android tmp目录权限不够,/tmp目录下执行脚本失败提示Permission denied
- java必学_Java基础系列之初识JAVA
- 2018春考计算机技能考试题目,2018年山东省春季高考技能考试信息技术类专业考试(样题).PDF...
- OpenShift 4 - Service Mesh环境和BookInfo应用安装脚本
- OpenShift 4 之使用https协议访问Route