java 实现 pbkdf2_sha256加密验证算法
2019独角兽企业重金招聘Python工程师标准>>>
import java.nio.charset.Charset;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.Base64;
import java.util.Random;import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;/*** pbkdf2_sha256加密验证算法* @author Administrator**/
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Pbkdf2Sha256 {private static final Logger logger=LoggerFactory.getLogger(Pbkdf2Sha256.class);//默认迭代计数为 20000private static final Integer DEFAULT_ITERATIONS = 20000;//算法名称private static final String algorithm = "pbkdf2_sha256";/*** 获取密文* @param password 密码明文* @param salt 加盐* @param iterations 迭代计数* @return*/private 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, 256);SecretKey secret = null;try {secret = keyFactory.generateSecret(keySpec);} catch (InvalidKeySpecException e) {logger.error("Could NOT generate secret key",e);}byte[] rawHash = secret.getEncoded();byte[] hashBase64 = Base64.getEncoder().encode(rawHash);return new String(hashBase64);}/*** 密文加盐* @return String*/private static String getsalt(){int length = 12;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);}/*** rand salt* iterations is default 20000* @param password* @return*/public static String encode(String password) {return encode(password, getsalt());}/*** rand salt* @param password* @return*/public static String encode(String password,int iterations) {return encode(password, getsalt(),iterations);}/*** iterations is default 20000* @param password* @param salt* @return*/public static String encode(String password, String salt) {return encode(password, salt, DEFAULT_ITERATIONS);}/*** * @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 consist of: ALGORITHM, ITERATIONS_NUMBER, SALT and// HASH; parts are joined with dollar character ("$")String[] parts = hashedPassword.split("\\$");if (parts.length != 4) {// wrong hash formatreturn false;}Integer iterations = Integer.parseInt(parts[1]);String salt = parts[2];String hash = encode(password, salt, iterations);return hash.equals(hashedPassword);}
转载于:https://my.oschina.net/haopeng/blog/2873022
java 实现 pbkdf2_sha256加密验证算法相关推荐
- java提供密码加密的实现
Md5加密 /*** 提供密码加密的类*/ public class Md5Util {public static String encode(String msg){try {MessageDige ...
- javascript rsa java,用javascript与java执行
RSA加密与解密
用javascript与java执行 RSA加密与解密 2009-12-12 14:58:30 出处:https://www.yqdown.com 这几天一直做安全登录,网上查了好多资料,不尽如意 ...
- java python rsa加密_实现Java加密,Python解密的RSA非对称加密算法功能
摘要 因为最近业务需要使用到openssl的rsa非对称加密算法,研究了下它的使用方式,但是特殊在于前端分IOS和android两端,所以前端部门要求使用java给他们做一个加密工具包,但是因为服务端 ...
- java 接口 安全加密_Java中的安全加密
java 接口 安全加密 上一次我写关于密码学的文章时 ,我概述了Apache Shiro加密API,并展示了如何使用其两个对称密码. 我还写道:"您不需要在应用程序中加密和解密敏感数据的更 ...
- php 3des 兼容java,java版3des加密程序,可与php兼容
java版3des加密程序,可与php兼容 时间:2009-03-29 22:35来源:未知 作者:admin 点击:次 代码: import java.io.UnsupportedEncodingE ...
- java使用RSA加密方式,实现数字签名
全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用RSA加密方式,实现数字签名.数字签名,使用私钥获取签名,使用公钥校验签名 测试代码 public static void main( ...
- java使用DES加密方式,实现对数据的加密解密
全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用DES加密方式,实现对数据的加密解密.加密和解密中需要使用同一个秘钥 第一种方式,使用类型Key作为加密解密的共同秘钥. 测试代码 p ...
- java使用RSA加密方式实现数据加密解密
全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用RSA加密方式实现数据加密解密,需要首先产生私钥和公钥 测试代码 public static void main(String arg ...
- Java实现MD5加密解密类
Java实现MD5加密以及解密类,附带测试类,具体见代码. MD5加密解密类--MyMD5Util,代码如下: [java] view plaincopy package com.zyg.securi ...
最新文章
- 2021年广东省高考英语听说成绩查询,广东2021年高考准考证今起自行打印 成绩及分数线6月24日左右公布...
- 51nod 1268 和为K的组合 dfs
- 访百度奥运logo设计师李兴钢:虚实之间最美的呈现
- 使用Swashbuckle构建RESTful风格文档
- BZOJ2809-左偏树合并
- 随手小记·080911
- mysql判断可用性,MySQL -- 主從復制的可靠性與可用性
- python分类器鸢尾花怎么写_python机器学习基础教程:鸢尾花分类
- java键盘输入到文件中_在Linux中使用java和javac命令编译运行java文件
- Spark2.0.2+Zeppelin0.6.2 环境搭建 初探
- 面试题 01.01. 判定字符是否唯一 (计数排序思想)
- 内存、cache和寄存器之间的关系及区别
- 图表无法显示中文字,都是方框框?
- java浏览 下单界面_Javaweb网上商城项目实战(24)实现订单详情查询功能
- 1000m交叉网线最简单做法
- 小锤子要出来?老罗傲娇属性不再
- python大数据挖掘系列之淘宝商城数据预处理实战
- GoogleEarth二次开发平台指南(1) ---如何将谷歌地球嵌入到自定义的窗体中
- 06 体脂率案例优化
- android16进制编辑器,16进制编辑器app