【问题标题】:Android: How safe is PBKDF2 with a 4 digit pin?Android:带有 4 位密码的 PBKDF2 有多安全?
【发布时间】: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


【解决方案1】:

攻击者如何从共享偏好中检索刷新令牌并将其解密?

我不清楚如何检索它,我不确定如何从 Android 中的共享首选项中检索值。解密很简单,攻击者暴力破解 4 位 PIN。再多的延迟或盐也无济于事。

对称密钥在安全元件内吗?

不,它在 PBKDF2 操作后在内存中。

此实施对恶意软件或 root 的安全性如何?

没那么安全,基本上你希望他们不会对破解 PIN 感兴趣。

暴力破解密钥有多容易? (除非用户手动尝试 10k 次以插入正确的引脚)

你是什么意思除了那个?检索密钥的唯一方法是:

  1. 暴力破解 PBKDF2 并尝试解密(这是迄今为止最明显的);
  2. 以某种方式读出SecretKeySpec的记忆(更难);
  3. 对可能泄露密钥的 AES 实现执行边信道攻击(如果您现在使用良好的 Android 实现,这将非常棘手。

基本上,如果您可以限制猜测操作的数量,您只能使用 PIN。加密值似乎不是这种情况。


顺便说一下,大于 16 到 32 字节的盐是没有意义的。在 base 64 编码之前连接盐、IV 和密文更有意义(并且返回一个已经编码这些值的对象根本没有意义)。 12K 操作似乎很多,但现在计算机速度很快,您可能希望使该值可配置并更高。

【讨论】:

  • 感谢您的回答,您怎么知道对称密钥不在安全元件中?你在哪里读到的?
猜你喜欢
  • 2010-11-24
  • 1970-01-01
  • 2013-05-19
  • 2011-09-20
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 2012-10-04
  • 2016-04-06
相关资源
最近更新 更多