最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Android使用KeyStore对数据进行加密的示例代码
时间:2017-02-13 编辑:简简单单 来源:一聚教程网
谈到 Android 安全性话题,Android Developers 官方网站给出了许多很好的建议和讲解,涵盖了存储数据、权限、网络、处理凭据、输入验证、处理用户数据、加密等方方面面
密钥的保护以及网络传输安全 应该是移动应用安全最关键的内容。Android 提供大量用来保护数据的加密算法,例如 Cipher 类中提供了 AES 和 RSA 算法,再例如安全随机数生成器 SecureRandom 给 KeyGenerator 提供了更加可靠的初始化参数,避免离线攻击等等。
而如果需要存储密钥以供重复使用,Android 提供了 KeyStore 等可以长期存储和检索加密密钥的机制,Android KeyStore 系统特别适合于存储加密密钥。”AndroidKeyStore” 是 KeyStore 的一个子集,存进 AndroidKeyStore 的 key 将受到签名保护,并且这些 key 是存在系统里的,而不是在 App 的 data 目录下,依托于硬件的 KeyChain 存储,可以做到 private key 一旦存入就无法取出,总之,每个 App 自己创建的 key,别的应用是访问不到的。
KeyStore 提供了两个能力:
有了这两个能力,我们的密钥保护就变得很容易了,你只需要:
在应用安装后第一次运行时,生成一个随机密钥,并存入 KeyStore
当你想存储一个数据,便从 KeyStore 中取出之前生成的随机密钥,对你的数据进行加密,加密完成后,已完成加密的数据可以随意存储在任意地方,比如 SharePreferences,此时即使它被他人读取到,也无法解密出你的原数据,因为他人取不到你的密钥
当你需要拿到你的原数据,只需要从 SharePreferences 中读取你加密后的数据,并从 KeyStore 取出加密密钥,使用加密密钥对 “加密后的数据” 进行解密即可
其中加密算法可以使用 Cipher AES 来保证安全性,不要使用自己创造的加密算法。
这就是使用 KeyStore 的一整套流程,另外 KeyStore 还可以用来做数据签名和签名验证,就像一个黑匣子一样,具体可以自行搜索了解。
KeyStore 适于存储运行时生产获取到的数据,比如运行时,用户输入的密码,或者服务端传下来的 token,但无法用于存储我们需要预设在 App 内的 API key / secret,对于这类需要预设的固定密钥,我将介绍一种十分安全、难破解的保护方式。
加密:
代码如下 | 复制代码 |
publicString encryptString(String needEncryptWord, String alias) { if(!"".equals(alias)&&!"".equals(needEncryptWord)){ if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { initKeyStore(alias); } String encryptStr=""; byte[] vals=null; try{ KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(alias,null); // RSAPublicKey publicKey = (RSAPublicKey) privateKeyEntry.getCertificate().getPublicKey(); if(needEncryptWord.isEmpty()) { // Toast.makeText(this, "Enter text in the 'Initial Text' widget", Toast.LENGTH_LONG).show(); returnencryptStr; }
// Cipher inCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidOpenSSL"); Cipher inCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); // inCipher.init(Cipher.ENCRYPT_MODE, publicKey); inCipher.init(Cipher.ENCRYPT_MODE, privateKeyEntry.getCertificate().getPublicKey());
ByteArrayOutputStream outputStream =newByteArrayOutputStream(); CipherOutputStream cipherOutputStream =newCipherOutputStream( outputStream, inCipher); cipherOutputStream.write(needEncryptWord.getBytes("UTF-8")); cipherOutputStream.close();
vals = outputStream.toByteArray(); }catch(Exception e) { e.printStackTrace(); } returnBase64.encodeToString(vals, Base64.DEFAULT); } return""; } |
解密:
代码如下 | 复制代码 |
publicString decryptString(String needDecryptWord, String alias) { if(!"".equals(alias)&&!"".equals(needDecryptWord)){ if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { initKeyStore(alias); } String decryptStr=""; try{ KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(alias,null); // RSAPrivateKey privateKey = (RSAPrivateKey) privateKeyEntry.getPrivateKey();
// Cipher output = Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidOpenSSL"); Cipher output = Cipher.getInstance("RSA/ECB/PKCS1Padding"); // output.init(Cipher.DECRYPT_MODE, privateKey); output.init(Cipher.DECRYPT_MODE, privateKeyEntry.getPrivateKey()); CipherInputStream cipherInputStream =newCipherInputStream( newByteArrayInputStream(Base64.decode(needDecryptWord, Base64.DEFAULT)), output); ArrayList intnextByte; while((nextByte = cipherInputStream.read()) != -1) { values.add((byte)nextByte); }
byte[] bytes =newbyte[values.size()]; for(inti =0; i < bytes.length; i++) { bytes[i] = values.get(i).byteValue(); }
decryptStr =newString(bytes,0, bytes.length,"UTF-8"); }catch(Exception e) { e.printStackTrace(); } returndecryptStr; } return""; } |
相关文章
- sora软件价格介绍 02-22
- sora官网入口地址一览 02-22
- Sora生成的视频使用教程 02-22
- 《梦幻西游》元宵灯谜线索答案大全2024 02-22
- 《原神》有朋自远方来第一天通关攻略 02-22
- 《苏醒之路》四个结局达成攻略 02-22