在密码学中,scrypt(念作“ess crypt”)是Colin Percival于2009年所发明的金钥推衍函数,当初设计用在他所创立的Tarsnap服务上。设计时考虑到大规模的客制硬件攻击而刻意设计需要大量内存运算。2016年,scrypt算法发布在RFC 7914。scrypt的简化版被用在数个密码货币的工作量证明(Proof-of-Work)上。
Scrypt不仅计算所需时间长,而且占用的内存也多,使得并行计算多个摘要异常困难,因此利用rainbow table进行暴力攻击更加困难。Scrypt 没有在生产环境中大规模应用,并且缺乏仔细的审察和广泛的函数库支持。但是,Scrypt 在算法层面只要没有破绽,它的安全性应该高于PBKDF2和bcrypt。
Scrypt 官网地址:https://www.tarsnap.com/scrypt.html
Scrypt 算法 Java 的实现
下面是 Scrypt 算法的调用。
下面的代码实现了真正的加密
加密后的字节数组还需要使用 Base64 进行 encode。
完整的 Scrypt Java 版本已经放到github上。github地址:https://github.com/fengzhizi715/blockchain_study
Scrypt 算法 C 的实现
在 Android 中调用 Scrypt 算法。
其中,SignUtils 是通过 JNI 来调用 C 的代码。
另外,需要注意的是在 Android 中,Base64 的工具类略有不同。
完整的 Scrypt C 版本已经放到github上,方便在 App 中进行调用。github地址:https://github.com/fengzhizi715/Scrypt_jni
总结
上面整理了 Scrypt 的两种实现方式,如果对于安全性要求很高的密码,可以采用 Scrypt 算法。该算法唯一的缺点就是慢。
关注【Java与Android技术栈】
领取专属 10元无门槛券
私享最新 技术干货