随着个人信息安全意识的提高,APP的功能设计越来越需要对数据进行更安全的处理,经常会有新闻爆出某某应用又在后台偷偷获取用户联系人、短信、通话记录等等个人信息。科技发展在带来便利的同时,也会有很多安全问题,如何保证用户数据的安全存取呢?Google提供了Security组件来进行数据保护,一起来看看吧!
Android Jetpack库提供了Security组件,用于信息保存和读取时的保护,提供了与静态数据读写有关以及秘钥创建和验证相关的实现。
该库提供了以下两种安全级别设定:
平衡加密和性能的安全保护
在此安全级别下,适用于消费者应用程序,例如银行和聊天应用程序,包括执行证书吊销检查的企业程序。
最大安全保护
此安全级别适用于需要硬件支持的秘钥库和需要用户提供秘钥访问权限的应用程序。
下面开始介绍如何使用Security库进行安全性配置,以及如何安全地读写存储在文件和SharedPreferences中的加密数据。
Security库秘钥管理分为两个部分:
秘钥集合
包含一个或多个秘钥来加密文件或共享的SharedPreferences数据,存储在SharedPreferences文件中。
主密钥
用来加密所有秘钥集合,其存储在Android Keystore系统中
//定义主秘钥的方法
//秘钥生成参数规范可以自定义,建议会用当前指定值
val keyGenParameterSpec = MasterKeys.AES256_GCM_SPEC
val masterKeyAlias = MasterKeys.getOrCreate(keyGenParameterSpec)
Security库包含EncryptedFile和EncryptedSharedPreferences两个类,分别对文件和SharedPreferences数据进行安全写入和读取。
EncryptedFile
提供了自定义实现的FileInputStream和FileOutputStream,为应用带来更安全的流读取和写入操作。
EncryptedSharedPreferences
包装类,并使用两种方式自动加密键值:SharedPreferences
1. Key加密使用的是确定性的加密算法,使得秘钥可以被加密
2. Value加密使用AES-256 GCM加密,不确定加密
下面介绍如何使用EncryptedFile来进行文件的安全读取操作(使用Kotlin语言)。
val fileToRead = "my_sensitive_data.txt"
lateinit var byteStream: ByteArrayOutputStream
val encryptedFile = EncryptedFile.Builder(
File(context.getFilesDir(), fileToRead),
context,
masterKeyAlias,
EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build()
try {
encryptedFile.openFileInput().use { fileInputStream ->
try {
byteStream = ByteArrayOutputStream()
var nextByte = fileInputStream.read()
while (nextByte != -1) {
byteStream.write(nextByte)
nextByte = fileInputStream.read()
}
val fileContents = byteStream.toByteArray()
} catch (ex: Exception) {
// Error occurred opening raw file for reading.
} finally {
fileInputStream.close()
}
})
} catch (ex: IOException) {
// Error occurred opening encrypted file for reading.
}
下面介绍如何使用EncryptedFile来进行文件的安全写入操作(使用Kotlin语言)。
val fileToWrite = "my_other_sensitive_data.txt"
val encryptedFile = EncryptedFile.Builder(
File(context.getFilesDir(), fileToWrite),
context,
masterKeyAlias,
EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build()
// Write to a file.
try {
val outputStream: FileOutputStream? = encryptedFile.openFileOutput()
outputStream?.apply {
write("MY SUPER SECRET INFORMATION"
.toByteArray(Charset.forName("UTF-8")))
flush()
close()
}
} catch (ex: IOException) {
// Error occurred opening file for writing.
}
对于需要使用最大安全性的数据保护方式,需要做更多的处理:
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
try {
//设置安全加密参数
KeyGenParameterSpec keyGenParameterSpec = MasterKeys.AES256_GCM_SPEC;
String masterKeyAlias = MasterKeys.getOrCreate(keyGenParameterSpec);
KeyGenParameterSpec.Builder builder
= new KeyGenParameterSpec.Builder(masterKeyAlias, KeyProperties.PURPOSE_ENCRYPT)
.setUserAuthenticationRequired(true)
.setUserAuthenticationValidityDurationSeconds(6000);//用户鉴权成功后,还可使用时间
KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
//注意不能用来做生物识别加密操作
//提示用户输入凭据
keyguardManager.createConfirmDeviceCredentialIntent("title", "description");
} catch (GeneralSecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
注意:使用Security库时,需要导入依赖库
dependencies {
...
implementation 'androidx.security:security-crypto:1.0.0-alpha02'
...
}
下面介绍如何使用EncryptedSharedPreferences来进行安全编辑操作(使用Kotlin语言)。
val sharedPreferences = EncryptedSharedPreferences
.create(
fileName,
masterKeyAlias,
context,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
val sharedPrefsEditor = sharedPreferences.edit()
- END -
科技的发展,总是会对人们已知的事物带来各种积极和消极的影响,给人们带来便利的同时,也在频繁获取个人隐私、用户数据信息。如何更安全的保护用户数据,用户隐私,是每一个科技领域都需要深入研究的方向。
这里有更多科技资讯,新技术学习,关注我们,和我们一起成长!