pbkdf2_sha256加密验证算法


最近在改由Java取代Python验证用户登录的加密方式。Python通过pbkdf2算法和sha256算法对用户的密码进行加密,由于业务需要,转由Java方式实现。弄了许久也是终于完成了Python和Java的无缝对接。


主要使用"getEncodedHash"方法和"encode"方法,具体的加密方式根据自己的需求而定,Python代码就不贴了,这里主要是给大家一个参考思路

Java代码:

具体参考 getEncodedHash 方法,因为返回有很多格式,这里列举了Base64和64位的十六进制

下面贴代码: Pbkdf2Sha256 工具类


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.Random;/*** PBKDF2_SHA256加密验证算法** @author 慌途L*/public class Pbkdf2Sha256 {private static final Logger logger = LoggerFactory.getLogger(Pbkdf2Sha256.class);/*** 盐的长度*/public static final int SALT_BYTE_SIZE = 16;/*** 生成密文的长度(例:64 * 4,密文长度为64)*/public static final int HASH_BIT_SIZE = 64 * 4;/*** 迭代次数(默认迭代次数为 2000)*/private static final Integer DEFAULT_ITERATIONS = 2000;/*** 算法名称*/private static final String algorithm = "PBKDF2&SHA256";/*** 获取密文* @param password   密码明文* @param salt       加盐* @param iterations 迭代次数* @return*/public static String getEncodedHash(String password, String salt, int iterations) {// Returns only the last part of whole encoded passwordSecretKeyFactory keyFactory = null;try {keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");} catch (NoSuchAlgorithmException e) {logger.error("Could NOT retrieve PBKDF2WithHmacSHA256 algorithm", e);}KeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt.getBytes(Charset.forName("UTF-8")), iterations, HASH_BIT_SIZE);SecretKey secret = null;try {secret = keyFactory.generateSecret(keySpec);} catch (InvalidKeySpecException e) {logger.error("Could NOT generate secret key", e);}//使用Base64进行转码密文
//        byte[] rawHash = secret.getEncoded();
//        byte[] hashBase64 = Base64.getEncoder().encode(rawHash);
//        return new String(hashBase64);//使用十六进制密文return toHex(secret.getEncoded());}/*** 十六进制字符串转二进制字符串* @param hex     十六进制字符串* @return      */private static byte[] fromHex(String hex) {byte[] binary = new byte[hex.length() / 2];for (int i = 0; i < binary.length; i++) {binary[i] = (byte) Integer.parseInt(hex.substring(2 * i, 2 * i + 2), 16);}return binary;}/*** 二进制字符串转十六进制字符串* @param array     二进制数组* @return      */private static String toHex(byte[] array) {BigInteger bi = new BigInteger(1, array);String hex = bi.toString(16);int paddingLength = (array.length * 2) - hex.length();if (paddingLength > 0)return String.format("%0" + paddingLength + "d", 0) + hex;elsereturn hex;}/*** 密文加盐     (获取‘SALT_BYTE_SIZE’长度的盐值)* @return*/public static String getsalt() {//盐值使用ASCII表的数字加大小写字母组成int length = SALT_BYTE_SIZE;Random rand = new Random();char[] rs = new char[length];for (int i = 0; i < length; i++) {int t = rand.nextInt(3);if (t == 0) {rs[i] = (char) (rand.nextInt(10) + 48);} else if (t == 1) {rs[i] = (char) (rand.nextInt(26) + 65);} else {rs[i] = (char) (rand.nextInt(26) + 97);}}return new String(rs);}/*** 获取密文* 默认迭代次数:2000* @param password      明文密码* @return*/public static String encode(String password) {return encode(password, getsalt());}/*** 获取密文* @param password      明文密码* @param iterations    迭代次数* @return*/public static String encode(String password, int iterations) {return encode(password, getsalt(), iterations);}/*** 获取密文* 默认迭代次数:2000* @param password      明文密码* @param salt          盐值* @return*/public static String encode(String password, String salt) {return encode(password, salt, DEFAULT_ITERATIONS);}/*** 最终返回的整串密文** 注:此方法返回密文字符串组成:算法名称+迭代次数+盐值+密文* 不需要的直接用getEncodedHash方法返回的密文** @param password   密码明文* @param salt       加盐* @param iterations 迭代次数* @return*/public static String encode(String password, String salt, int iterations) {// returns hashed password, along with algorithm, number of iterations and saltString hash = getEncodedHash(password, salt, iterations);return String.format("%s$%d$%s$%s", algorithm, iterations, salt, hash);}/*** 验证密码* @param password       明文* @param hashedPassword 密文* @return*/public static boolean verification(String password, String hashedPassword) {//hashedPassword = 算法名称+迭代次数+盐值+密文;String[] parts = hashedPassword.split("\\$");if (parts.length != 4) {return false;}//解析得到迭代次数和盐值进行盐值Integer iterations = Integer.parseInt(parts[1]);String salt = parts[2];String hash = encode(password, salt, iterations);return hash.equals(hashedPassword);}
}

Test测试类:通过密码和密文,验证Python密文是否和Java的一样


package com.huangtu.test;import java.io.IOException;public class TestCode {public static void main(String[] args) throws IOException {//获取密文(密码加盐)String salt = Pbkdf2Sha256.encode("123456");System.out.println("salt===" + salt);boolean verification = Pbkdf2Sha256.verification("123456", salt);System.out.println(verification);/*** Python生成的密码和密文* admin123456* PBKDF2&SHA256$2000$SzNgPdzz$50f22e207abec8e837bce97642a46f965f19d992217d7df9be496700b286345d* PBKDF2&SHA256$2000$VzmO4yOZ$71891148cfbdd9103aaa511d20dc52431c8947ce4a00d89708231ec76053f6f3* PBKDF2&SHA256$2000$3xuRb8AR$6bff0310fd35c88572633b00d36e9039fef3e68c6e37b14204958946e8738e93*/String oldPassword7 = "PBKDF2&SHA256$2000$SzNgPdzz$50f22e207abec8e837bce97642a46f965f19d992217d7df9be496700b286345d";String oldPassword8 = "PBKDF2&SHA256$2000$VzmO4yOZ$71891148cfbdd9103aaa511d20dc52431c8947ce4a00d89708231ec76053f6f3";String oldPassword9 = "PBKDF2&SHA256$2000$3xuRb8AR$6bff0310fd35c88572633b00d36e9039fef3e68c6e37b14204958946e8738e93";boolean verification7 = Pbkdf2Sha256.verification("admin123456", oldPassword7);boolean verification8 = Pbkdf2Sha256.verification("admin123456", oldPassword8);boolean verification9 = Pbkdf2Sha256.verification("admin123456", oldPassword9);System.out.println(verification7);System.out.println(verification8);System.out.println(verification9);}
}

通过测试,用户在python注册加密密码后得到密文,即密码,在java以相同的方式去加密,然后对两个密文进行对比,相同则是密码一致,否则不一致


最后,希望对大家有所帮助!


参考网址
  • https://howtodoinjava.com/security/how-to-generate-secure-password-hash-md5-sha-pbkdf2-bcrypt-examples/

  • https://blog.csdn.net/u014375869/article/details/46773995

  • https://my.oschina.net/haopeng/blog/2873022

pbkdf2sha256加密验证算法 | 密码加密相关推荐

  1. 用java实现字符串的加密_JAVA 字符串加密、密码加密实现方法

    在我们的程序设计中,我们经常要加密一些特殊的内容,今天总结了几个简单的加密方法,分享给大家! 如何用java实现字符串简单加密解密?为保证用户信息安全,系统在保存用户信息的时候,务必要将其密码加密保存 ...

  2. java绕过加密密码_JAVA中使用MD5加密实现密码加密

    1.新建Md5.java package com.loger.md5; import java.io.UnsupportedEncodingException; import java.securit ...

  3. RSA加密(密码加密)

    在项目开发的时候为了安全起见,需要对密码进行加密,我呢就简单说一下rsa加密怎么用吧~ HTML页面需要先引入js文件: <script src="rsa/Barrett.js&quo ...

  4. java提供密码加密的实现

    Md5加密 /*** 提供密码加密的类*/ public class Md5Util {public static String encode(String msg){try {MessageDige ...

  5. Spring Boot 密码加密的 2 种姿势!

    先说一句:密码是无法解密的. 密码无法解密,还是为了确保系统安全.今天松就来和大家聊一聊,密码要如何处理,才能在最大程度上确保我们的系统安全. 1.为什么要加密 2011 年 12 月 21 日,有人 ...

  6. BCrypt加密怎么存入数据库_Spring Boot 中密码加密的两种姿势

    1.为什么要加密 2.加密方案 3.实践3.1 codec 加密3.2 BCryptPasswordEncoder 加密 4.源码浅析 先说一句:密码是无法解密的.大家也不要再问松哥微人事项目中的密码 ...

  7. 循序渐进学spring security 第八篇,如何配置密码加密?是否支持多种加密方案?

    文章目录 回顾 密码明文会带来什么问题? 如何加密? PasswordEncoder 加密接口 如何配置? 加密的密码在登录的时候是怎么校验的? 默认的加密是什么? DaoAuthentication ...

  8. SpringBoot 密码加密方式

    1.为什么要加密 2011 年 12 月 21 日,有人在网络上公开了一个包含 600 万个某网站用户资料的数据库,数据全部为明文储存,包含用户名.密码以及注册邮箱.事件发生后该网站在微博.官方网站等 ...

  9. 一篇文章带你入门 SpringSecurity实现密码加密和解码

    文章目录 一.加密和解密 1. 为什么要加密 2. 加密方案 3. PasswordEncoder 二.前期准备 二.用户配置 1. 配置文件 2. 配置类 一.加密和解密 1. 为什么要加密 201 ...

  10. Spring Boot 中密码加密的两种姿势!

    先说一句:密码是无法解密的.大家也不要再问松哥微人事项目中的密码怎么解密了! 密码无法解密,还是为了确保系统安全.今天松哥就来和大家聊一聊,密码要如何处理,才能在最大程度上确保我们的系统安全. 本文是 ...

最新文章

  1. iOS上相见恨晚的6个APP
  2. Eclipse字符集设置方式
  3. 以下不能在python编译环境_win7 下解决python 集成编译环境IDLE无法打开的问题。...
  4. Eclipse如何卸载插件
  5. 人工智能如何提升大数据存储与管理效率?
  6. 读《大学之路》有感②
  7. layui ajax form 表单提交 后 清空
  8. 语法错误: leftparen 应在 colon 之前
  9. matlab三相系统电阻折算,基于MATLAB三相异步电动机调压调速系统方案.doc
  10. date和datetime长度设置多少_太原市玻璃温室大棚多少钱
  11. Win10右键新建中没有新建文件夹,电脑右键新建文件夹不见了
  12. FFmpeg 转码压缩
  13. Electron客户端的自动升级方案-2022版
  14. BigNumber.js
  15. 指纹识别_Android指纹认证教程
  16. Flash:动画实例--球体弹跳
  17. python instagram 爬虫
  18. 网卡驱动修改服务器,网卡驱动配置
  19. python编程:从入门到实践 阅读笔记
  20. 去除IDEA中代码的波浪线(黄色警示线)

热门文章

  1. CSPs-2020 T2 动物园
  2. excel冻结窗格线的设置问题
  3. 计算机主机cpu内存,两分钟看懂计算机中CPU、内存、硬盘的工作原理
  4. 关于计算机的CPU的发展历史,计算机CPU的全部发展历史
  5. 宝塔php伪静态规则,宝塔BT面板伪静态规则大全集合汇总
  6. B站大佬开发的这款无障碍看片神器火了,我有一个大胆的想法...
  7. chorme的性能优化工具
  8. 友善之臂最新版mini2440学习笔记——u-boot 1.1.6移植(一)
  9. 投稿时文章脚注数字如何去掉
  10. 企鹅号发布腾讯创作者社群计划 助力精品打造行业升级