PBKDF2加密

PBKDF2加密算法 PBKDF2加密解密算法 做过网站的人都知道用户密码必须经过加密的,其中用的最普遍的就是MD5加密了.但是随着彩虹桥技术的兴起,MD5加密已经不再安全.今天小编就要介绍一种全新的,安全的加密算法:PBKDF2 PBKDF2算法通过多次hash来对密码进行加密。原理是通过password和salt进行hash,然后将结果作为salt在与password进行hash,多次重复此过程,生成最终的密文。此... 阅读详情
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.math.BigInteger;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;

/**
 * @author : zhangxin
 * @version : V1.0
 * @since : 2018/09/16
 */
public class PBKDF2Utils {
    private static final String PBKDF2_ALGORITHM = "PBKDF2WithHmacSHA1";

    /**
     * 盐的长度
     */
    private static final int SALT_BYTE_SIZE = 32 / 2;

    /**
     * 生成密文的长度
     */
    private static final int HASH_BIT_SIZE = 128;

    /**
     * 迭代次数
     */
    private static final int PBKDF2_ITERATIONS = 64 * 64;

    /**
     * 对输入的密码进行验证
     *
     * @param attemptedPassword 待验证的密码
     * @param encryptedPassword 密文
     * @param salt              盐值
     * @return 是否验证成功
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeySpecException
     */
    public static boolean authenticate(String attemptedPassword, String encryptedPassword, String salt)
            throws NoSuchAlgorithmException, InvalidKeySpecException {
        // 用相同的盐值对用户输入的密码进行加密
        String encryptedAttemptedPassword = getEncryptedPassword(attemptedPassword, salt);
        // 把加密后的密文和原密文进行比较,相同则验证成功,否则失败
        return encryptedAttemptedPassword.equals(encryptedPassword);
    }

    /**
     * 生成密文
     *
     * @param password 明文密码
     * @param salt     盐值
     * @return
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeySpecException
     */
    public static String getEncryptedPassword(String password, String salt) throws NoSuchAlgorithmException,
            InvalidKeySpecException {
        KeySpec spec = new PBEKeySpec(password.toCharArray(), fromHex(salt), PBKDF2_ITERATIONS, HASH_BIT_SIZE);
        SecretKeyFactory f = SecretKeyFactory.getInstance(PBKDF2_ALGORITHM);
        return toHex(f.generateSecret(spec).getEncoded());
    }

    /**
     * 通过提供加密的强随机数生成器 生成盐
     *
     * @return
     * @throws NoSuchAlgorithmException
     */
    public static String generateSalt() throws NoSuchAlgorithmException {
        SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
        byte[] salt = new byte[SALT_BYTE_SIZE];
        random.nextBytes(salt);

        return toHex(salt);
    }

    /**
     * 十六进制字符串转二进制字符串
     *
     * @param hex the hex string
     * @return the hex string decoded into a byte array
     */
    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 the byte array to convert
     * @return a length*2 character string encoding the byte array
     */
    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;
        } else {
            return hex;
        }
    }
}
/**
 * @author : zhangxin
 * @version : V1.0
 * @since : 2018/09/16
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class PBKD2Test {
    @Test
    public void getPassword() {
        try {
            String password = PBKDF2Utils.getEncryptedPassword("zhangxin", "123456");
            System.out.println(password);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

java加密算法pbkdf2 PBKDF2算法通过多次hash来对密码进行加密。原理是通过password和salt进行hash,然后将结果作为salt在与password进行hash,多次重复此过程,生成最终的密文。此过程可能达到上千次,逆向破解的难度太大,所以PBKDF2算法是安全的。 package com.bolt.zkkw.util; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; import java.math.. 阅读详情

相关推荐

golang pbkdf2加密存储用户密码

概述 PBKDF2(Password-Based Key Derivation Function) 是一个用来导出密钥的函数,常用于生成加密的密码。原理是通过 password 和 salt 进行 hash 加密,然后将结果作为 salt 与 password 再进行 hash,多次重复此过程,生成最终的密文。如果重复的次数足够大(几千数万次),破解的成本就会变得很高。而盐值的添加也会增加“彩虹表”攻击的难度。 用户密码采用PBKDF2算法存储,比较安全。 代码 package pbkdf2 import

weixin_55891654的博客 797

PBKDF2算法Java实现

1.加盐处理        在密码学中,是指通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为“加盐”(比如可以在密码中混入一段“随机”的字符串再进行哈希加密,这个被字符串被称作盐值)。   2.为什么要加盐       涉及身份验证的系统都需要存储用户的认证信息,常用的用户认证方式主要为用户名和密码的方式,为了安全起见,用户输入的密...

huoji555的博客 9447

SOI技术实战:从晶圆结构到芯片性能提升的完整解析

本文深入解析SOI(Silicon on Insulator)技术如何通过独特的三明治晶圆结构提升芯片性能,涵盖从220nm SOI层设计到7nm节点的工艺挑战。详细探讨了埋氧层的绝缘优势、性能提升的物理机制,以及AMD处理器和5G射频中的实战应用,为半导体行业提供关键技术洞见。

wdx0123456的博客 960

密码学系列之:1Password的加密基础PBKDF2

文章目录简介PBKDF2和PBKDF1PBKDF2的工作流程详解PBKDF2的key生成流程HMAC密码碰撞PBKDF2的缺点总结 简介 1password是一个非常优秀的密码管理软件,有了它你可以轻松对你的密码进行管理,从而不用再考虑密码泄露的问题,据1password官方介绍,它的底层使用的是PBKDF2算法对密码进行加密。 那么PBKDF2是何方神圣呢?它有什么优点可以让1password得以青睐呢?一起来看看吧。 PBKDF2和PBKDF1 PBKDF的全称是Password-Based Key D

程序那些事 2万+

【车辆仿真】从0开始建立dSPACE RT Simulink工程:CAN通信(RTICANMM方法)

【工程环境信息】:本文基于链接文章搭建SCALEXIO Rack RTPC总线节点,用于与AutoBox通信硬件:上位机:惠普台式PC(Windows 11专业版)下位机(实时机):AutoBox (DS1006)板卡:DS6342软件:本文所使用的DBC链接提示:以下是本篇文章正文内容,下面案例可供参考!!!的部分一定记得配置,其他的按需配置RTICANMM的灵活度非常高,尽可能参考Help文档,理解相应的配置内容官方有RTICANMM的样例工程,在下方路径。

winnizap的博客 2381

零、HarmonyOS应用开发者基础学习总览

零、HarmonyOS应用开发者基础学习总览

weixin_45029825的博客 1453

pbkdf2 java,在Java中使用PBKDF2进行密码验证

I'm doing password based file encryption in Java; I'm using AES as the underlying encryption algorithm and PBKDF2WithHmacSHA1 to derive a key from a salt and password combination using the following c...

weixin_33042645的博客 500

CocosCreator 面试题(十七)Cocos creator 固定宽度与固定高度的底层原理是什么?Cocos creator是如何做适配的?

通过固定宽度或固定高度的适配方式,可以使游戏在不同屏幕尺寸上保持一定的一致性,确保游戏中的元素的大小和位置相对稳定。具体选择哪种适配方式取决于你的游戏需求和设计考虑。在 Cocos Creator 中,你可以通过设置「设计分辨率」和使用相对坐标和布局方式来实现固定宽度或固定高度的适配。总之,Cocos Creator 提供了多种适配方式和工具,帮助你在不同屏幕尺寸上保持游戏画面的一致性。在 Cocos Creator 中,固定宽度和固定高度是两种常见的适配方式,用于在不同屏幕尺寸上保持游戏画面的一致性。

w风雨无阻w的专栏 1687

PBKDF2算法:保护密码安全的重要工具

在当今的数字世界中,密码安全是至关重要的。为了保护用户密码免受未经授权的访问和破解,Password-Based Key Derivation Function 2 (PBKDF2)算法成为了一种重要的工具。本文将介绍PBKDF2算法的优缺点,以及它如何解决密码存储和验证中的一些问题。我们还将提供一个使用Java编写的完整示例,以帮助读者深入了解PBKDF2算法的实际应用。

https://blog.cmdragon.cn/ 2423

零基础学习CANoe Panel(5)——改变变量的值,控件图像也改变,这是怎么回事?

Panel 中控件的图像随着值变化,是怎么回事?

蚂蚁小兵 2145

把 SAP BTP Destination 写进 MTA:一段 com.sap.application.content 配置背后的部署编排学

MTA内容模块解析:SAP BTP中的声明式部署机制 本文详细解析了mta.yaml中com.sap.application.content模块在SAP BTP云环境中的作用。该模块通过声明式配置实现内容投递,无需编译或部署代码。核心功能包括: Destination创建:通过content-target:true标识将配置投递到Destination服务 HTML5应用部署:将静态资源投递到HTML5 Application Repository 安全集成:配置XSUAA服务实现OAuth2用户令牌交换

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 164

PBKDF2加密解密 - 前端crypto-js.min.js和后端UE4使用Crypto++互相加解密

UE4中Crypto++库加密解密 第四节:PBKDF2加密解密 - 前端crypto-js.min.js和后端UE4使用Crypto++互相加解密 文章目录UE4中Crypto++库加密解密前言一、前端二、后端1. C++代码2. 蓝图测试结果总结参考 前言 有一个应用系统包含前端html和UE4后端。其中前端某一部分导航功能需要跳转至后端(简单的说就是前端现在要把后端中的所有功能包含进来),这里就涉及到前端登录后的权限要同步到后端,实现单点登录,针对外部用户就采用了aes加密的方式验证。 实现思路:

weixin_43923422的博客 3768

10倍开发者的 Dify 魔法书:从零构建全栈 AI 应用

“不懂底层算法,也能开发爆款 AI 应用吗?” 答案是:绝对可以。 Dify 正在重新定义 AI 应用的开发范式——通过可视化的低代码平台,将原本需要数周的开发周期压缩到几小时。无论你是前端、后端、产品经理,还是渴望破局的独立开发者,这都是你不可错过的红利。 我们将手把手教你利用 Dify 快速接入百模大战,零代码搭建企业级知识库,并一键发布你的专属 AI 助手、智能客服和自动化工作流。 告别重复造轮子,掌握 Dify,一个人就是一支 AI 团队。现在上车,开启你的 10 倍速开发之旅!

davidwang456的专栏 682

PBKDF2加密的实现

PBKDF2(Password-Based Key Derivation Function)。 通过哈希算法进行加密。因为哈希算法是单向的,可以将任何大小的数据转化为定长的“指纹”,而且无法被反向计算。另外,即使数据源只改动了一丁点,哈希的结果也会完全不同。这样的特性使得它非常适合用于保存密码,因为我们需要加密后的密码无法被解密,同时也能保证正确校验每个用户的密码。但是哈希加密可以通过字典攻击和

Shawn1992的学习笔记 2万+

白话机器学习算法理论+实战番外篇之Xgboost

1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Adaboost等 无监督算法:聚类,降维,关联规则, PageRank等 我前面已经尝试用最白话的语言完成了一个白话机器学习算法理论+实战系列,这个系列已经基本包含了上面这些算...

Miracle8070 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

php pbkdf2,PBKDF2加密的实现

import java.math.BigInteger;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.security.spec.InvalidKeySpecException;import java.security.spec.KeySpec;import j...

weixin_35870390的博客 477

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

iOS开发 PBKDF2加密

既然用到PBKDF2,定义就不多介绍了 导入(如果没有索引可以直接复制粘贴) #import &lt;CommonCrypto/CommonKeyDerivation.h&gt; 主要方法CCKeyDerivationPBKDF 各个参数的意思 CCPBKDFAlgorithm algorithm:加密的类型,这里只有kCCPBKDF2一个可选值; const char ...

Seaven的博客 1353

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

pbkdf2&sha256加密验证算法 | 密码加密

pbkdf2_sha256加密验证算法 最近在改由Java取代Python验证用户登录的加密方式。Python通过pbkdf2算法和sha256算法对用户的密码进行加密,由于业务需要,转由Java方式实现。弄了许久也是终于完成了Python和Java的无缝对接。 主要使用getEncodedHash方法和encode方法,具体的加密方式根据自己的需求而定,Python的代码就不贴出来了,这里主...

慌途L 2万+

Spring Security 密码加密器 Pbkdf2PasswordEncoder 、 BCryptPasswordEncoder

开始 Spring Security 中含有两种经常被使用的密码加密器:Pbkdf2PasswordEncoder 、 BCryptPasswordEncoder 加密器工作形式: 传入原本密码,通过 encode() 方法获得加密后的字符串,字符串的生成与时间或者 hash 有关。所以,即使需要加密的密码相同,每次生成的字符串也不同,但是通过相同密码生成的字符串即使不同,也都可以通过...

Bolview的博客 4279

使用 PBKDF2 加密 SecureRandom生成salt

/** * 密码加密 * @param password * @param salt * @return */ public static String getPBKDF2(String password, String salt) { //将16进制字符串形式的salt转换成byte数组 byte[] bytes = java.util.Base64.getDecoder().decode(salt); KeySpec spec = new PBEKeySpec(password.toCharArray(

weixin_39792316的博客 602

java常用加密算法之pbkdf2

PBKDF2简介 常见的加密算法,如MD5,此类算法为单向的,无法通过逆向破解,但由于技术的不断进步,可以通过字典和暴力破解。后来人们通过加盐来增加密码的安全性,但彩虹表的出现让这种方式也变得不安全。以至于出现了现在的PBKDF2算法。 PBKDF2算法通过多次hash来对密码进行加密。原理是通过password和salt进行hash,然后将结果作为salt在与password进行hash,多次重复此过程,生成最终的密文。此过程可能达到上千次,逆向破解的难度太大,破解一个密码的时间可能需要几百年,所以PB

kunkunliu的博客 2608

js中pbkdf2_hmac加密python翻译

加密js代码 import hashlib import base64 import hmac import binascii import json import re from Crypto.Cipher import AES from binascii import a2b_hex # url加密代码 """ f = o.default.HmacSHA1(o.default.enc.Utf...

qq_43500579的博客 1409

UE4中实现PBKDF2加密验证

UE4中Crypto++库加密解密 第三节:UE4中实现PBKDF2加密验证 文章目录UE4中Crypto++库加密解密前言代码1. C++代码2. 蓝图测试结果参考 前言 通过哈希算法进行加密。因为哈希算法是单向的,可以将任何大小的数据转化为定长的“指纹”,而且无法被反向计算。另外,即使数据源只改动了一丁点,哈希的结果也会完全不同。这样的特性使得它非常适合用于保存密码,因为我们需要加密后的密码无法被解密,同时也能保证正确校验每个用户的密码。但是哈希加密可以通过字典攻击和暴力攻击破解。 密码加盐。盐是一

weixin_43923422的博客 2211
上一篇: SpringBoot使用分布式生成ID生成算法snowflake
下一篇: Java中的四种访问级别(public,default,protected,private)
cashZhang27
博客等级 码龄10年 22粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值