如何在KivyMD应用目录外安全存储账号与密码以避免更新丢失
解决方案
用Android Keystore加密后存外部存储
这是安卓官方推荐的敏感信息存储方案,密钥会被系统托管(支持硬件加密的设备会存在安全模块里,无法导出),能最大化保障安全性。
操作步骤:- 在Keystore中生成专属密钥对
- 用公钥加密账号密码明文
- 将加密后的内容写入外部存储的应用专属目录(比如
Context.getExternalFilesDir(null),这个目录更新应用不会被清空,卸载才会删除) - 读取时用私钥解密还原明文
简化代码示例:
// 生成Keystore密钥对 val keyPairGen = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore") val spec = KeyGenParameterSpec.Builder( "app_secure_key", KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT ).setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP) .build() keyPairGen.initialize(spec) val keyPair = keyPairGen.generateKeyPair() // 加密账号密码 val cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding") cipher.init(Cipher.ENCRYPT_MODE, keyPair.public) val encryptedContent = cipher.doFinal("user:pass123".toByteArray(Charsets.UTF_8)) // 写入外部存储专属目录 val secureFile = File(context.getExternalFilesDir(null), "secure_data") FileOutputStream(secureFile).use { it.write(encryptedContent) }加密后存SharedPreferences
SharedPreferences默认存储在应用私有目录,应用更新不会丢失数据,但默认是明文。可以用Keystore加密账号密码后再存入,避免明文泄露。这种方式不用处理外部存储权限,适合不想碰文件操作的场景。加密Room数据库
用Room框架创建本地数据库,搭配SQLCipher给数据库加密,把数据库文件放在应用专属外部目录。既利用数据库的结构化存储优势,又通过加密保障数据安全,更新应用后数据不会丢失。
注意事项
- 外部存储文件要设置私有权限,禁止其他应用访问
- 绝对不能明文存储账号密码,所有敏感内容必须加密后再保存
- 安卓10及以上优先用应用专属外部目录,避免动态存储权限申请
内容的提问来源于stack exchange,提问作者dheeraj
相关产品推荐
相关产品推荐

