【发布时间】:2020-08-07 15:27:48
【问题描述】:
我们的产品经理想要一个 4 位 PIN 码用于登录我们的应用,显然是出于用户体验的原因,因此用户每次登录时都不必记住密码。
可以从后端检索刷新令牌以获取可以访问 API 的会话令牌。在我们的应用程序中,我们使用 AES 和 PBKDF2 加密刷新令牌。生成随机盐和 IV 以及用作 PBKDF2 密码的 4 位数字。
加密后,我将盐、IV 和密文 base64 编码存储在私有共享首选项中。
加密代码如下:
const val CPR_TRANSFORMATION = "AES/CBC/PKCS7Padding"
const val ALGORITHM_TYPE = "PBKDF2WithHmacSHA1"
const val ITERATION_AMOUNT = 12000
const val KEY_SIZE = 256
private fun encrypt(passCode: String, data: ByteArray): Encrypted { //e.g.: passCode = "0000"
val salt = ByteArray(256)
SecureRandom().nextBytes(salt)
val iv = ByteArray(16)
SecureRandom().nextBytes(iv)
val cipher = Cipher.getInstance(CPR_TRANSFORMATION)
cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(passCode, salt), IvParameterSpec(iv))
val raw = cipher.doFinal(data)
return Encrypted(salt.encodeBase64(), iv.encodeBase64(), raw.encodeBase64())
}
private fun getSecretKey(passCode: String, salt: ByteArray): Key {
val pbKeySpec = PBEKeySpec(passCode.toCharArray(), salt, ITERATION_AMOUNT, KEY_SIZE)
val keyBytes = SecretKeyFactory.getInstance(ALGORITHM_TYPE).generateSecret(pbKeySpec).encoded
return SecretKeySpec(keyBytes, KeyProperties.KEY_ALGORITHM_AES)
}
现在我的问题是:这个实现有多安全?
- 攻击者如何从共享中检索刷新令牌 偏好并解密?
- 对称密钥是否在安全元件内?
- 此实施对恶意软件或 root 的安全性如何?
- 暴力破解密钥有多容易? (除了用户尝试 10k 手动插入正确的引脚)
【问题讨论】:
-
我不认为你会在这里找到一个好的答案,最好在安全社区问这个问题
标签: android security encryption pbkdf2