使用ARGON2id加密算法加密密码java调用argon2-jvm包

1,199 阅读2分钟

1、为什么使用ARGON2id加密密码?

  • Password 是 Web 服务主要的认证方式之一。一般加密密码的方式主要有DES加密、RSA加密、以及Hash加密。DES、RSA本文不介绍。

  • 经常被大家用来加密的Hash算法有MD5和SHA系列(如SHA1、SHA256、SHA384、SHA512等),但是单纯用Hash算法是可以通过hash碰撞来进行破解密码,因此也会有加“盐”提高安全性的方法,可以解决大多数场景。

  • 但无法阻止 Brute Force Attack,借助 GPU、FPGA、ASIC 等定制硬件可以非常低成本的进行 Hash 计算。此外,如果 salt 和 password 被一起被拖库(甚至代码),会使得破解成本更加低。

  • Argon2 是 PHC(Password Hashing Competition[3] )的冠军,利用大量内存和大量计算资源进行 Hash 计算。提供三个版本:

  • Argon2d:更快,使用 data-dependent 的内存访问方式,data 是需要 Hash 的 password 和 salt。适合加密货币和不会收到 side-channel timing 攻击的应用。

  • Argon2i:使用 data-independent 的内存访问方式,更适合密码哈希等。他比 Argon2d 慢,因为它需要更多次内存计算(passes)来保护免受 tradeoff 的攻击。

  • Argon2id:是 Argon2i 和 Argon2d 的混合版本,第一次计算用 Argon2i,后续的计算用 Argon2d。如果没有特定的理由,推荐使用 Argon2id。

2、java实现ARGON2id算法

  1. 引入argon2-jvm依赖
<!--添加密码加密argon2依赖-->
<dependency>
   <groupId>de.mkammerer</groupId>
   <artifactId>argon2-jvm</artifactId>
   <version>2.11</version>
</dependency>

2、代码调用

import de.mkammerer.argon2.Argon2;
import de.mkammerer.argon2.Argon2Factory;
/**
 * 基于argon2-jvm包调用
 */
public class Argon2PasswordEncoder  {

    /*
     * 设置默认推荐参数
     */
    private static final int ITERATIONS = 2;
    private static final int MEMORY = 65536;
    private static final int PARALLELISM = 1;

    /*
     * 推荐 argon2id类型共有三种类型可选(ARGON2i,ARGON2d,ARGON2id;)
     */
    public static final Argon2Factory.Argon2Types TYPE = Argon2Factory.Argon2Types.ARGON2id;

    /*
     * 工厂模式获取单例Argon2对象
     */
    private static final Argon2 INSTANCE = Argon2Factory.create(TYPE);

    /**
     * 使用argon2id加密密码
     */

    public static String encode(String password) {
        return INSTANCE.hash(ITERATIONS, MEMORY, PARALLELISM, password.toCharArray());
    }

    /**
    * 使用argon2id算法验证密码是否正确
    * @param encodedPassword 加密后密码
    */
    public static boolean matches(String encodedPassword, String password) {
        return INSTANCE.verify(encodedPassword, password.toCharArray());
    }
}