我决定使用 AndroidX 安全库中的新 EncryptedSharedPreferences。由于该应用程序支持 API 21 及更高版本,我决定尝试这个新的 v1.1.0-alpha02 版本,因为它支持 API 21+
所以,我成功地实现了 API 23+,但是对于不支持 Android KeyStore 的旧版本,我无法做到正确,并且没有确切的说明应该如何创建主密钥以使其以某种方式工作.
初始化 SharedPrefs 的代码:
EncryptedSharedPreferences.create(
"prefs_name",
createMasterKey(),
App.appContext,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
使用此功能创建主密钥
private fun createMasterKey(): String {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC)
} else {
val alias = "my_alias"
val start: Calendar = GregorianCalendar()
val end: Calendar = GregorianCalendar()
end.add(Calendar.YEAR, 30)
val spec = KeyPairGeneratorSpec.Builder(App.appContext)
.setAlias(alias)
.setSubject(X500Principal("CN=$alias"))
.setSerialNumber(BigInteger.valueOf(abs(alias.hashCode()).toLong()))
.setStartDate(start.time).setEndDate(end.time)
.build()
val kpGenerator: KeyPairGenerator = KeyPairGenerator.getInstance(
"RSA",
"AndroidKeyStore"
)
kpGenerator.initialize(spec)
val kp: KeyPair = kpGenerator.generateKeyPair()
kp.public.toString()
}
}
我在某个地方找到了这个解决方案,但它没有经过验证(没有确认它确实有效),但它似乎应该有效。
将此代码块用于 API 21 和 22 时,在创建 EncryptedSharedPreferences 时出现错误,并显示:Method throwed 'com.google.crypto.tink.shaded.protobuf.InvalidProtocolBufferException' 异常。协议消息包含无效标签(零)。
有人找到了这个实现的解决方案吗,或者你知道为什么会这样吗?我认为这会对很多人有所帮助,因为没有确切的解释这个主密钥应该包含什么。
提前致谢!