Java Spring中三个密码加密库包

Spring Security加密模块深度解析 Spring Security Crypto模块(SSCM)提供了完整的加密解决方案,包含密钥生成器和加密器两大核心组件,简化了Java项目的加密实现。密钥生成器分为StringKeyGenerator(生成字符串密钥)和BytesKeyGenerator(生成字节密钥),支持安全随机和共享密钥两种模式。加密器则提供TextEncryptor(文本加密)和BytesEncryptor(字节加密)两种接口,实现AES-256等标准算法。该模块有效避免了开发者引入额外依赖,并提供了从基础到高级的加密功能,包括盐 阅读详情

每当您需要在应用程序中实现密码哈希或散列时,您应该牢记一些最佳实践。

  1. 永远不要自己实现密码哈希算法——改用经过严格审查的开发人员库!密码学是一个复杂的领域,如果你尝试自己实现一个流行的算法,就会出现很多问题。
  2. 随着计算机每年变得越来越强大,密码哈希算法(及其参数)需要调整!现代密码哈希算法依赖于您(作为开发人员)来指定他们在计算哈希时应该使用多少资源,并且随着时间的推移,您将需要更新这些参数。掌握此类情况的唯一方法是紧跟最新的安全新闻和趋势。

在决定如何存储敏感密码时,你应该考虑的第一件事是你是否想自己处理认证和授权问题。

有许多服务可以为你解决这个问题。使用认证和授权服务可以消除你在应用程序中安全存储密码的负担。

有许多商业服务,如Auth0和Okta,使之变得简单。只要你选择的供应商支持OpenID Connect等开放标准,你就能轻松地将它们集成到你的Java应用中(例如Spring Boot)。

此外,你的供应商可能也能支持MFA(多因素认证),以进一步提高你的终端用户的安全性。

如果您 确实 需要自己在 Java 应用程序中存储密码,那么本文适合您。

如果您在应用程序中存储用户名和密码,无论您做什么, 都不要 以纯文本形式存储 密码 

密码哈希算法可将纯文本密码转换为一串数据,您可以安全地存储在数据库中,并且永远不会被反转(您可以将纯文本密码转换为哈希,但不可能将哈希转换为密码,因此命名为“单向”函数)。

密码哈希算法是专为处理密码而设计的单向函数。

您需要一个 强大的密码散列算法 来处理您的用户密码。一个好的密码散列算法会消耗大量的计算能力和内存。在谈论密码哈希算法时:他们使用的计算资源越多越好! 

Argon2id

目前(2022 年)使用的最佳算法是 Argon2id。  Argon2 是一个密钥推导函数,被选为  密码哈希竞赛 的获胜者。它有三个不同的版本:

  • Argon2d: 最大限度地抵抗 GPU 破解攻击 
  • Argon2i: 针对侧信道攻击进行了优化
  • Argon2id: 混合版本

建议使用 Argon2id 版本的密码,因为它可以平衡侧通道和基于 GPU 的攻击。您可以通过提供三个参数来配置 Argon2id 算法:内存大小 (m)、迭代次数 (t) 和并行度 (p)。

目前,建议使用 Argon2id,内存至少为 15 MiB,迭代次数为 2,并行度为 1。该算法已经包括为每个用户自动加盐以防止预先计算的攻击,所以这里不需要做任何特别的事情。

将 Spring Security Crypto 与 Bouncy Castle 一起使用

在 Java 应用程序中实现 Arong2id 的最简单方法是使用 spring-security-crypto 库。尽管它是 Spring 框架的一部分,但您不必使用 Spring 框架的其余部分。

spring-security-crypto 库有一个 Argon2PasswordEncoder 您可以使用的。我个人认为命名有点偏离,因为这在技术上不是编码器而是哈希器。

Spring 库 bouncycastle 用作包含 Argon2 算法的基于 Java 的完整实现的依赖项。

spring-security-crypto 库可以被认为是一个直观的界面 bouncycastle,使其更易于使用。

<dependency>
   <groupId>org.springframework.security</groupId>
   <artifactId>spring-security-crypto</artifactId>
   <version>5.6.2</version>
</dependency>
<dependency>
   <groupId>commons-logging</groupId>
   <artifactId>commons-logging</artifactId>
   <version>1.2</version>
</dependency>
<dependency>
   <groupId>org.bouncycastle</groupId>
   <artifactId>bcpkix-jdk15on</artifactId>
   <version>1.70</version>
</dependency>

默认情况下 Argon2PasswordEncoder 使用 Argon2id 版本,m=4MiB、t=3 和 p=1。尽管迭代次数高于最小值,但您可能仍要考虑更高的内存消耗。

在下面的 Java 示例中,我使用了 m=15Mib、t=2 和 p=1 的最低要求。我使用与盐和哈希长度的默认值相同的值。

Argon2PasswordEncoder encoder = <b>new</b> Argon2PasswordEncoder(32,64,1,15*1024,2);
<b>var</b> myPassword = <font>"ThisIsMyPassword"</font><font>;

<b>var</b> encodedPassword = encoder.encode(myPassword);
System.out.println(encodedPassword);

<b>var</b> validPassword = encoder.matches(myPassword, encodedPassword);
System.out.println(validPassword);
</font>

代码的输出:

$argon2id$v=19$m=15360,t=2,p=1$YpRuuQhW1dHOimAnWD5TRU6Sebitu+fIrmIrenr+YOM$hkEXhhHpu2NUcPwhV4IUQelQdf4I8V+iyFsFiC8BYEisE3oWFv96zYeNA1i/awhaDo1XHz6Pp/1r55SS/I4AIA
True

为 JVM 使用 Argon2 绑定

JVM 库的  Argon2 Binding 是 Spring 库的替代方案。该库由 Moritz Halbritter 创建,使用 JNA 调用原生 C 库。这种方法的优点是它使用了 Argon2 作者的原始实现,并且可能包括性能优势。因此,您需要能够访问系统上的底层 C 库。  

您可以选择使用包管理器自己安装此 C 库,或者依赖包含一组预编译 Argon2 库的库。推荐第一个,原因很明显,它更小。

没有预编译库:

<dependency>
    <groupId>de.mkammerer</groupId>
    <artifactId>argon2-jvm-nolibs</artifactId>
    <version>2.11</version>
</dependency>

使用预编译库:

<dependency>
    <groupId>de.mkammerer</groupId>
    <artifactId>argon2-jvm</artifactId>
    <version>2.11</version>
</dependency>

这个库的使用非常简单。在下面的代码示例中,您可以看到一个与 Spring 示例等效的示例,使用相同的最小参数。

Argon2 argon2 = Argon2Factory.create(Argon2Factory.Argon2Types.ARGON2id, 32, 64);
<b>var</b> myPassword = <font>"ThisIsMyPassword"</font><font>;

<b>var</b> hash = argon2.hash(2,15*1024,1, myPassword.toCharArray());
System.out.println(hash);

<b>var</b> validPassword = argon2.verify(hash, myPassword.toCharArray());
System.out.println(validPassword);
</font>

scrypt

如果你因为任何原因不能使用Argon2id,  scrypt 是一个不错的第二选择。与argon2id类似,scrypt是另一种强大的密码散列算法,它允许你配置各种成本参数来增加它所消耗的资源。

根据  OWASP Password cheat sheet , ,你应该使用一个最小的CPU/内存成本参数(N),一个最小的块大小(r),以及一个并行化参数(p)。下面的选项被认为是你应该使用的最小值。

N=2^16(64 MiB),r=8(1024字节),p=1
N=2^15 (32 MiB), r=8 (1024字节), p=2
N=2^14 (16 MiB), r=8 (1024 字节), p=4
N=2^13 (8 MiB), r=8 (1024 字节), p=8
N=2^12 (4 MiB), r=8 (1024字节), p=15

请注意,以上的scrypt参数列表都会产生同样强大的密码哈希值。上面的选项只是展示了通过为N、r和p参数指定不同的值,你可以让scrypt算法使用更多的CPU或内存资源,这取决于你的偏好。我下面的建议展示了真实世界的用法,你可以简单地复制和粘贴,以达到简便的目的。

spring-security-crypto库支持许多算法,包括SCrypt。你可以按照我们使用Argon2Encoder的方式使用SCryptEncoder。在下面的例子中,我使用了中间的建议,在CPU和内存分配之间提供了一个良好的平衡。

SCryptPasswordEncoder encoder = <b>new</b> SCryptPasswordEncoder(16384, 8, 4, 32, 64);
<b>var</b> myPassword = <font>"ThisIsMyPassword"</font><font>;

<b>var</b> encodedPassword = encoder.encode(myPassword);
System.out.println(encodedPassword);

<b>var</b> validPassword = encoder.matches(myPassword, encodedPassword);
System.out.println(validPassword);
</font>

输出:

e0804$8FQ4x/ntwEz2ZNu8QRyIQJlAXR+gQkiG3WulLMEq/kioVtaFiKE7sZDGgtmqUmwB8OE+f7Eagux9QXG478unLw==$RS1Bz5Uf30dWGxc+vtlkjj7tPnPdgq8YD1V8odhPW4A=
<b>true</b>

使用BCRYPT

如果Argon2id和scrypt不可用,另一个强有力的选择是BCrypt。如果你决定使用  BCrypt ,工作系数参数应该设置为不低于10。

你可以以类似于以前的方式使用spring-security-crypto库。默认的工作系数被设置为10,但我们在下面的例子中把它设置为14(在2022年是一个合理的数字)。

BCryptPasswordEncoder encoder = <b>new</b> BCryptPasswordEncoder(14)。

你设置的工作系数越高,哈希值就越强,但它也会花费更多的CPU资源(和时间!)来完成运行。在我的本地机器上,设置运行BCrypt的工作负荷为10,平均花费约89ms。对于14的工作量,平均是1033ms。这几乎是12倍的时间。这绝不是一个准确的基准,但它确实显示了增加工作因素的影响。

SpringSecurity(安全) SpringSecurity(安全) 认识SpringSecurity Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块默认的技术选型,他可以实现强大的Web安全控制,对于安全控制,我们仅需要引入 spring-boot-starter-security 模块,进行少量的配置,即可实现强大的安全管理! 记住几个类: WebSecurityConfigurerAdapter:自定义Security策略 AuthenticationManagerBuil 阅读详情

相关推荐

SpringBoot使用Jasypt对配置文件加密、数据库密码加密_jasypt对springboot配置文件加密的使用

Jasypt是一个Java简易加密库,用于加密配置文件中的敏感信息,如数据库密码。jasypt库与springboot集成,在实际开发中非常方便。1、Jasypt Spring Boot 为 spring boot 应用程序中的属性源提供加密支持,出于安全考虑,Spring boot 配置文件中的敏感信息通常需要对它进行加密/脱敏处理,尽量不使用明文,要实现这一点,办法有很多,自己手动对敏感信息进行加解密也是可以的。

2501_90405033的博客 1006

SpringSecurity------Spring Security Crypto(五)

Spring Security Crypto模块支持对称加密、密钥生成和密码编码, 该代码作为核心模块的一部分分发,但不依赖于任何其他Spring Security(或Spring)代码。Encryptors提供了构造对称加密器的工厂方法,使用这个类可以创建ByteEncryptor用来加密byte[]数据,还可以构造TextEncryptor来加密文本字符串,Encryptors是线程安全的。使用Encryptors.stronger()工厂方法可以创建一个BytesEncryptor实例 该加密方法使用

豢龙先生 3102

Spring Security 密码加密

/增加通过加密算法名来获取加密算法。

2012年开始工作,全栈开发老兵,目前已是一个老师,分享这么多年的心得体会 377

Java Spring中的三个密码加密库包

每当您需要在应用程序中实现密码哈希或散列时,您应该牢记一些最佳实践。 永远不要自己实现密码哈希算法——改用经过严格审查的开发人员库!密码学是一个复杂的领域,如果你尝试自己实现一个流行的算法,就会出现很多问题。 随着计算机每年变得越来越强大,密码哈希算法(及其参数)需要调整!现代密码哈希算法依赖于您(作为开发人员)来指定他们在计算哈希时应该使用多少资源,并且随着时间的推移,您将需要更新这些参数。掌握此类情况的唯一方法是紧跟最新的安全新闻和趋势。 在决定如何存储敏感密码时,你应该考虑的第一件事是你是否想自己

m0_69860228的博客 1843

Java加密库Jasypt实战解析与应用

Jasypt(Java Simplified Encryption)是一个专为Java平台设计的轻量级加密工具库,旨在降低开发者在应用中集成加密功能的复杂度。它不仅封装了底层加密算法的实现细节,还提供了简单易用的API接口,支持多种加密方式,如对称加密、摘要算法等,广泛适用于Java SE、Spring Boot等各类Java项目。通过Jasypt,开发者可以轻松实现字符串加密、配置文件敏感信息保护、环境变量加密等功能,极大提升了应用的安全性。

weixin_42128315的博客 1127

Jasypt加密工具包:Java应用数据安全解决方案

本文还有配套的精品资源,点击获取 简介:Jasypt是一款简单易用的Java加密库,旨在简化敏感数据加密。提供广泛的API支持多种加密技术,例如AES和Blowfish,及对配置文件和数据库查询的加密。集成Spring框架支持,以及多语言环境下的i18n支持,使得Jasypt能够适应不同项目的需求。开发者通过合理密钥管理和密码策略,结合集成测试,可确保Jasypt在生产环境...

weixin_26854475的博客 1696

java jasypt_Java Jasypt加密库

介绍Jasypt是Java流行的加密库,使用Jasypt-spring-boot-starter可以和springboot整合独立使用配置依赖org.jasyptjasypt1.9.3基本使用public class Basic {public static void main(String[] args) {StandardPBEStringEncryptor encryptor = new S...

weixin_42405368的博客 306

java自带crypto库使用示例

http://blog.youkuaiyun.com/watch_ch/article/details/50923754

推荐开源项目:JASYPT - 简化版的Java加密库

推荐开源项目:JASYPT - 简化版的Java加密库 1、项目介绍 JASYPT(Java Simplified Encryption)是一个强大的Java库,旨在为开发者提供简单易用的加密功能。无论你是新手还是经验丰富的程序员,这个库都能让你轻松地在项目中集成加密,无需深入了解复杂的密码学原理。 了解更多:http://www.jasypt.org 立即下载:jasypt 1.9.3 (包括二...

gitblog_01151的博客 1223

CryptoUtils:JAVA Utility类用于处理常见的消息加密

密码工具 JAVA类的集合,以帮助通过通信通道执行加密。

sap 新增科目表_SAP系统中四大科目表的总结

操作科目表定义-OB13 2国家科目表定义-OB13 3集团科目表定义-OB13 4合并科目表(ECCS)定义-CX10 4分配操作科目表到公司代码-OB62 5分配国家科目表到公司代码-OB62 6分配集团科目表到操作科目表-OB13 6分配集团科目表到合并科目表-CXNF 7Operation 8定义集团科目表的科目-FSP0 8定义国家科目表的科目-FSP0 8定义操作科目表的科目-FSP0...

weixin_39585463的博客 1722

Jasypt加密库基本使用方法

Jasypt是一个java的加密库,通过对java自带加密算法的二次包装,提供了十分简洁的加密接口,在保证安全的同时,降低了密码算法的使用门槛,并且提供多种数据类型的加密。在Jasypt-spring-boot的加持下,Jasypt可以在Spring应用中轻易集成,充分利用Spring的依赖注入,属性检测等特性。本文对Jasypt的使用方法做了基本的介绍,满足绝大多数的使用场景。

u012247462的专栏 3920

【原创工具 | OpenCV-CamCalib】一个基于 OpenCV 的自动化相机数据采集和标定程序

一个基于OpenCV的自动化相机数据采集和标定程序。系统内置相机地址默认为 0。

XavierJ的博客 2698

好用的敏感信息加密库Jasypt

功能:Jasypt提供了一个简单且安全的方式来加密和解密数据,支持多种加密器,适用于各种场景,如数据库密码加密、API密钥保护、用户密码加密等。特点简单易用:Jasypt提供了简单易用的API,开发人员可以轻松集成到项目中。强大的加密功能:支持多种加密算法和加密器,可以根据具体需求选择合适的加密方式。高安全性:基于标准的加密技术,确保数据的安全性。

xuweilin的博客 2601

电容式麦克风:从原理到实际电路波形解析

本文深入解析电容式麦克风的工作原理,从核心的振膜与背板结构、电荷锁定机制到场效应管放大器的作用。通过实物拆解与等效电路分析,阐明声音振动如何转换为电压信号,并指导如何用示波器实测波形,直观展现声电转换过程,适合电子爱好者和音频技术学习者。

Black的专栏 1088

《QGIS快速入门与应用基础》230:添加图例工具

本文系统讲解QGIS图例制作的核心方法与优化技巧。首先强调图例与地图框的绑定逻辑,提出三种绑定状态及适用场景。详细拆解三种图例添加方法:布局工具栏一键添加法(新手首选)、菜单栏添加法和右键快捷创建法,并给出单地图框和多地图框两种典型场景的规范技巧。重点解决新手常见的图例杂乱、样式不规范、内容脱节等问题,帮助用户从基础图例制作进阶到符合行业标准的专业图例设计。通过分步操作图示和实用技巧,使读者能够快速掌握图例创建的核心流程与优化方法。

LuckyHanMo的博客 555

Spring Boot中如何对密码等敏感信息进行脱敏处理

Override// 返回固定脱敏值// 在DTO字段上指定序列化器。

zwh1zwh的博客 1261

Flutter框架GetX从入门到精通第二篇:路由管理-告别繁琐的Navigator

Flutter框架GetX从入门到精通第二篇:告别繁琐的Navigator。本系列将带你从零开始,一步步掌握 GetX 框架的核心功能与实战技巧。

鹏多多的博客 171

spring boot 中阿里druid 数据源配置及密码加密

spring boot 中阿里druid 数据源配置及密码加密

liwei10822的博客 4817

从HCI层浅析LE Audio通话建立流程

本文分析了BLE AUDIO通话协议建立的全过程。当手机来电时,系统会通过CCP EATT链路通知耳机准备通话,并断开原有音乐CIS连接。随后建立通话专用的CIG组,其参数设置(如MAX SDU SIZE=80、RTN=2)与音乐场景明显不同,更注重通话的实时性。文中详细描述了设置ISO数据路径、启用ASE、建立CIS连接等关键步骤,特别指出通话采用Conversational音频上下文类型。最后解析了ISO数据包参数含义,展示了10ms周期、32kHz采样率等通话特性参数。整个过程体现了BLE AUDIO

十多年蓝牙协议软件开发,擅长蓝牙协议分析 1864

中台战略-第五章、中台建设方法论

文章目录第五章、中台建设方法论5.1 中台架构整体策略5.2 业务顶层设计5.3 业务中台设计方法论5.3.1 能力支撑是基础5.3.2 中心自治是承载形式5.3.3 3层模型是骨架5.3.4 5步法是指导思想1. 业务抽象2. 高阶设计3. 组件建模4. 开发交付5. 持续运营5.4 数据中台设计方法论5.4.1 总体规划5.4.2 数据集成5.4.3 模型建设5.4.4 通用研发5.4.5 资产管理5.4.6 数据服务5.5 应用向中台迁移的3中途径和方法5.5.1 方法1:新应用替换旧应用5.5.2

沧海之巅的专栏 1461

3大抗量子加密库对比评测:Java开发者选型必读,错过即风险

为Java开发者提供抗量子加密选型指南,深入解析3大主流库对Java抗量子加密标准的支持情况,涵盖性能对比、集成难度与适用场景。助力系统平滑过渡至后量子时代,规避未来安全风险,值得收藏。

CodeVibe的博客 677

深入浅出:大型语言模型(LLM)的全面解读

在当今的数字化时代,人工智能技术已经成为各行各业的核心驱动力之一。而在人工智能的领域中,大型语言模型(LLM)作为一种引人瞩目的技术,正在以其强大的语言理解和生成能力引领着一场革命。本文旨在深入浅出地解读大型语言模型,探讨其背后的原理、技术突破、应用场景以及未来发展趋势。

fudaihb的博客 10万+

jasypt加密_【Java库】如何使用优秀的加密库Jasypt来保护你的敏感信息?

1 简介今天我们介绍一个Java库-Jasypt,全称为Java Simplified Encryption,用于加密解密。它能够让开发者用花费最小的工作而把加密集成到项目中,并且不需要对加密/解密有深入的了解。通过Maven引用jar包如下:<dependency> <groupId>org.jasypt</groupId> <artifactI...

weixin_39618339的博客 189

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SpringBoot集成BCrypt密码加密库

‌,不是传统意义上可解密的加密方式。它由 Niels Provos 和 David Mazières 于 1999 年设计 ,核心特点是‌‌(因为自动加盐),且‌‌,能有效抵御暴力破解。‌‌‌。

码农张三 245

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

jasypt加密_「Java库」如何使用优秀的加密库Jasypt来保护你的敏感信息?

1 简介今天我们介绍一个Java库-Jasypt,全称为Java Simplified Encryption,用于加密解密。它能够让开发者用花费最小的工作而把加密集成到项目中,并且不需要对加密/解密有深入的了解。通过Maven引用jar包如下: org.jasypt jasypt 1.9.3 compile2 简单文本加密文本加密是加密中最经常遇到的需求,如通讯消息、交易流水、账号信息等,这些都是...

weixin_31754073的博客 154
上一篇: Java 统计新客户
下一篇: Java编程小技巧——方法传回两个对象
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值