我正在寻找Java/Android上CCCalibratePBKDF方法的替代方案,以了解我在一定时间内可以进行多少轮PBKDF2。
你知道吗?
我目前正在实现自己的解决方案,该解决方案基于计算速度和少量回合,并据此猜测数字,但这非常不一致——在iOS上,数字是相当恒定的
附带说明-我不知道iOS的方法是基于真实数字计算的,还是他们只知道自己的硬件,所以他们提前知道数字。
我不认为测量本地设备是一个好的解决方案,因为针对PBKDF2的攻击不一定发生在设备本身。因此,本地设备的速度与安全性完全无关。
此外,在Android上,当对PBKDS2算法进行基准测试时,可能会有更多的后台应用程序处于活动状态,因此您不能简单地计算PBKDF2算法所需的时间。在具有BIG/LITTLE内核的设备上,可能会发生计算只使用弱LITTLE核的情况,这也会伪造结果。
因此,我将提供一个选项,用户可以设置迭代次数,而不是测量它。为了更简单的使用,我会使用一个名为";安全级别(越大越好,但可能导致延迟(";。Set是一个下拉字段,值从1到10,迭代次数呈指数增长-例如:
1 = 100.000 * 2^1 (200.000)
2 = 100.000 * 2^2 (400.000)
..
10 = 100.000 * 2^10 (102.400.000)
您正在搜索一个现代的密钥派生函数。通常会提到以下算法:PBKDF2(NIST唯一支持的算法(、bcrypt(比PBKDF2好(、scrypt(比bcrypt好(、argon2(高端(。
在java世界中,人们倾向于使用bcrypt,因为它是通过spring安全性(一种可以信任的实现(提供的算法。它也很容易使用,因为它只有一个功因子的维度(不像scrypt(。
在尝试选择最佳工作因素时,请记住,安卓世界被严重分割,设备的功能各不相同。你手机上的好东西,在某些设备上可能真的很慢。我相信iOS世界会更加一致。