BCryptPasswordEncoder加密

本文介绍了BCryptPasswordEncoder的优势及其在Spring Security中的应用。该加密方式每次生成不同的60位hash值,提高了安全性。文章还提供了配置示例,展示了如何在项目中实现BCryptPasswordEncoder。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     和其他加密方式相比,BCryptPasswordEncoder有着它自己的优势所在,首先加密的hash值每次都不同,就像md5的盐值加密一样,只不过盐值加密用到了随机数,前者用到的是其内置的算法规则,毕竟随机数没有设合适的话还是有一定几率被攻破的。其次BCryptPasswordEncoder的生成加密存储串也有60位之多。最重要的一点是,md5的加密不是spring security所推崇的加密方式了,所以我们还是要多了解点新的加密方式。

第一步。导入spring的相关依赖包,包括spring security的相关依赖包

 <dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-config</artifactId>
		</dependency>

因为BCryptPasswordEncoder加密的来源就是spring security中的一部分,所以这两个包比较重要。

其次就开始使用,记住要使用spring.security下的,不要选错。

BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
		String password = passwordEncoder.encode(seller.getPassword());
		seller.setPassword(password);

这是我截取的一部分代码中的片段,通过传入的值进行BCryptPasswordEncoder加密,然后获取,再保存。最后的格式是这样的,

其实下方的加密密文都是123456,但是由于每次的hash值都不同,导致加密密文都不一样,其实这才是我们所希望看到的,而不是千篇一律。

但是我们要考虑一个问题,通过加密密文后,密码可以加密了,但是我们会发现输入123456的密码进行登录时登录不了的,为什么?因为它识别不了我们加密密文和明文之间的转换,你需要告诉spring,我已经将明文进行转换,怎么告诉呢?

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	                    http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
						http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">
   
	<!-- 设置页面不登陆也可以访问 -->
	<http pattern="/*.html" security="none"></http>
	<http pattern="/css/**" security="none"></http>
	<http pattern="/img/**" security="none"></http>
	<http pattern="/js/**" security="none"></http>
	<http pattern="/plugins/**" security="none"></http>
	<http pattern="/seller/add.do" security="none"></http>

	<!-- 页面的拦截规则    use-expressions:是否启动SPEL表达式 默认是true -->
	<http use-expressions="false">
		<!-- 当前用户必须有ROLE_USER的角色 才可以访问根目录及所属子目录的资源 -->
		<intercept-url pattern="/**" access="ROLE_SELLER"/>
		<!-- 开启表单登陆功能 -->
		<form-login  login-page="/shoplogin.html" default-target-url="/admin/index.html" authentication-failure-url="/shoplogin.html" always-use-default-target="true"/>
		<csrf disabled="true"/>
		<!-- 放行内置框架页 -->
		<headers>
			<frame-options policy="SAMEORIGIN"/>
		</headers>
		<logout/>
	</http>
	
	<!-- 认证管理器 -->
	<authentication-manager>
		<authentication-provider user-service-ref="userDetailsService">
		<password-encoder ref="passwordEncoding"></password-encoder>
		</authentication-provider>	
	</authentication-manager>
	
	<beans:bean id="userDetailsService" class="com.pinyougou.service.UserDetailsServiceImpl">
	      <beans:property name="sellerService" ref="sellerService"></beans:property>
	</beans:bean>
	
	<beans:bean id="passwordEncoding" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></beans:bean>
	
	<!-- 引用dubbo 服务    代理-->
	<dubbo:application name="pinyougou-shop-web" />
	<dubbo:registry address="zookeeper://192.168.25.130:2181"/>
	<dubbo:reference id="sellerService" interface="com.pinyougou.sellergoods.service.SellerService"></dubbo:reference>
	
		
		
</beans:beans>

通过spring的注入的方式进行管理,告诉它我们采用的是这种加密方式,它就会将明文进行数据库判断,验证成功即可通过。

<think>好的,用户问的是“依赖配置没有会怎么样?”,需要详细解释在Java开发中,如果没有正确配置bcrypt加密所需的依赖会有什么后果。 首先,我需要回忆之前提供的排查指南中的第五部分“依赖配置问题”,里面提到了必须的依赖是spring-security-core。用户现在的问题直接关联到这部分内容,所以需要展开说明。 用户可能的背景是正在使用Spring Security进行密码加密,但遇到了问题,可能是在配置依赖时遗漏了,导致功能无法正常使用。他们可能对Maven或Gradle的依赖管理不太熟悉,或者在项目中没有正确添加相关库。 接下来要考虑用户的需求,他们可能想知道为什么依赖配置如此重要,以及如果缺少会有哪些具体的问题。可能需要分点列出不同的后果,比如编译错误、运行时异常、加密功能失效等。 需要确保回答结构清晰,每个后果都有具体的例子和解释。例如,编译错误是因为缺少相关的类,运行时NoClassDefFoundError是因为依赖没打包进去,Bean未注入导致空指针等。此外,还要提到版本冲突的可能性,以及如何解决这些问题。 还要注意使用中文,保持技术术语的准确性,同时让解释易懂。可能需要举出具体的代码示例,比如Maven的依赖配置和Bean的声明,来说明正确做法。 最后,确保回答覆盖用户可能遇到的所有相关问题,并给出解决方案,比如检查依赖、添加Bean配置等,帮助用户彻底理解问题所在和解决方法。</think>以下是依赖配置缺失时在Java项目中产生的具体影响及技术细节分析: --- ### 一、编译阶段问题 $$ \text{编译错误} = \text{缺少类定义} + \text{方法引用失败} $$ 1. **类无法解析** 当代码中使用`BCryptPasswordEncoder`但未配置依赖时: ```java // 出现红色编译错误:Cannot resolve symbol 'BCryptPasswordEncoder' BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); ``` 2. **方法不可用** 调用`encode()`或`matches()`方法时: ```java // 报错:Cannot resolve method 'encode(java.lang.String)' encoder.encode("123456"); ``` --- ### 二、运行时异常 $$ \text{ClassNotFoundError概率} \propto \frac{1}{\text{依赖配置完整度}} $$ | 异常类型 | 触发场景 | 典型日志 | |---------|---------|---------| | `NoClassDefFoundError` | 依赖JAR未打包 | `java.lang.NoClassDefFoundError: org/springframework/security/crypto/bcrypt/BCryptPasswordEncoder` | | `BeanCreationException` | Spring未找到Bean定义 | `Error creating bean with name 'userService': Unsatisfied dependency expressed through field 'passwordEncoder'` | --- ### 三、功能失效表现 $$ \text{系统行为} = \begin{cases} \text{明文存储} & \text{未加密} \\ \text{验证失败} & \text{无加密器} \end{cases} $$ 1. **加密流程短路** 没有`BCryptPasswordEncoder`实例时: ```java // 实际执行效果等价于明文存储 user.setPassword(rawPassword); ``` 2. **密码验证崩溃** 在安全校验流程中: ```java // 抛出NullPointerException if(passwordEncoder.matches(raw, storedHash)) { ... } ``` --- ### 四、依赖层级问题 即使添加了基础依赖,仍需注意传递依赖关系: ```mermaid graph TD A[spring-security-core] --> B[spring-core] A --> C[spring-aop] A --> D[spring-beans] A --> E[spring-context] ``` - **版本冲突** 当存在多个不同版本的Spring组件时: ```xml <!-- 危险配置示例 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.2.9.RELEASE</version> <!-- 旧版本 --> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> <version>5.7.3</version> <!-- 需要Spring 5.3+ --> </dependency> ``` --- ### 五、解决方案 1. **Maven完整配置** ```xml <!-- pom.xml 正确配置 --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> <version>5.7.3</version> <!-- 自动引入的传递依赖 --> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-old-module</artifactId> </exclusion> </exclusions> </dependency> ``` 2. **Gradle配置要点** ```gradle // build.gradle 正确配置 implementation('org.springframework.security:spring-security-core:5.7.3') { exclude group: 'org.springframework', module: 'spring-jcl' } ``` 3. **Bean声明强化** ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { // 必须声明为Bean且保持单例 @Bean public BCryptPasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(12); // 指定计算强度 } } ``` --- ### 六、验证手段 1. **依赖树分析** 执行命令查看依赖关系: ```bash mvn dependency:tree -Dincludes=org.springframework.security ``` 2. **运行时检测** 在应用启动时添加检查: ```java @SpringBootApplication public class Application implements CommandLineRunner { @Autowired private BCryptPasswordEncoder encoder; public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Override public void run(String... args) { Assert.notNull(encoder, "BCryptPasswordEncoder未成功注入"); } } ``` --- 通过精确控制依赖版本和保持依赖树清洁,可从根本上避免因依赖缺失导致的加密功能异常。建议使用Spring Boot BOM管理版本: ```xml <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.7.3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值