- 浏览: 194044 次
- 性别:
- 来自: 南京
文章分类
最新评论
前言:
在实际应用中,如果我们直接把密码以明文形式存储在数据库中存在一定的安全隐患。所以最好以某中方式将密码编码后再存储下来,用户登录时将用户输入的密码也按照相同的编码方式编码后和数据库中存储的密码相比较,即可以完成验证,也保证了密码等敏感信息的安全性。
1.在spring security中主要用PasswordEncoder对密码进行编码,因为历史版本的缘故,spring security中存在两个PasswordEncoder接口,一个存放在org.springframework.security.authentication.encoding包下面,只是为了和遗留系统兼容,已经不推荐使用,另一个放在org.springframework.security.crypto.password包下面,是重新设计的一套编码实现,新开发的应用应该采用这个包下的编码类。spring 给我们提供的认证实现类DaoAuthenticationProvider这两套密码编码方式都支持。
实际应用中不要选择普通的哈希函数如MD5、SHA,即便是追加了salted的版本也不要选,因为这种普通的哈希函数计算速度很快,这样攻击者就可以在很短时间内执行成百上千次的攻击。spring提供的org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder类是一个不错的选择,因为Bcrypt故意设计的计算速度很慢,就是为了应对密码攻击。记住在生产环境里,即便我们的数据库很安全也不要考虑把密码存储成明文形式。
2.那么什么是哈希呢
对密码进行哈希处理并不是spring security特有的概念,而是安全系统的一个通用概念。哈希算法是个单向函数,对输入的数据(如密码)进行计算,输出一个固定长度的数据(哈希码),例如对password字符进行MD5哈希后得到如下结果
哈希算法是单向的有两个意思,一是根据计算后的哈希码很难得到原始的输入数据(基本上是不可能的),二是只要输入的数据一样得到的哈希码都是一样的。正是这两个特性使得这个算法非常适合用来存储认证用户的密码信息,这样即便是存储用户信息的数据库被破解了,也不能用里面的信息登录我们的系统。
3.在哈希算法中加入Salt
单纯利用hash对密码进行编码有一个潜在的问题,因为现在有很多的黑客网站直接有哈希码和原始数据的对应结果,例如我们把5f4dcc3b5aa765d61d8327deb882cf99放在百度、google上搜素,我们很快就知道原始数据是password。而在实际应用中,用户都倾向与选择很相似的密码。因而当黑客想要攻击我们的网站时,他可以建立一个常见密码对应的哈希码的字典表,从而通过哈希码找到原始的密码值。为了应对这个攻击,我们可以选择高强度的密码策略,如最少位数限制,密码组合中至少有特殊字符、数字和字符等组成,另一种就是在计算哈希码时利用一个salt,作为对密码哈希时的附加值。理想情况下这个salt值越随机越好,加入salt后,攻击者想要破解原始密码就需要为每一个salt创建一个字典表,使破解的难度大大加大。spring推荐用的Bcrypt算法会自动的为我们生成一个随机的salt,并以特定的格式存储在计算后的哈希码中。
4.哈希和认证
当认证提供者(例如DaoAuthenticationProvider)需要验证用户提交的密码是否正确时,如果存储的用户密码经过了哈希处理,那么用户提交的密码必须经过相同的哈希算法处理,这个需要应用的开发者自己保证,因为spring security并不关系用户信息是如何存入数据库的。并且这个两个算法必须严格一致,假如你知道用户信息存入时用的是MD5算法,因而你在spring security中用Md5PasswordEncoder来编码,有时候还是会有问题,比如数据库存入时用了Base 64来做MD5编码,而Md5PasswordEncoder却用了默认的十六进制编码这样还是不能正确认证,所以在系统正式启用之前一定要哈希算法的一致并能正常认证成功。spring security推荐我们在两个地方都统一采用bcrypt,这样可以避免不必要的麻烦。
在实际应用中,如果我们直接把密码以明文形式存储在数据库中存在一定的安全隐患。所以最好以某中方式将密码编码后再存储下来,用户登录时将用户输入的密码也按照相同的编码方式编码后和数据库中存储的密码相比较,即可以完成验证,也保证了密码等敏感信息的安全性。
1.在spring security中主要用PasswordEncoder对密码进行编码,因为历史版本的缘故,spring security中存在两个PasswordEncoder接口,一个存放在org.springframework.security.authentication.encoding包下面,只是为了和遗留系统兼容,已经不推荐使用,另一个放在org.springframework.security.crypto.password包下面,是重新设计的一套编码实现,新开发的应用应该采用这个包下的编码类。spring 给我们提供的认证实现类DaoAuthenticationProvider这两套密码编码方式都支持。
实际应用中不要选择普通的哈希函数如MD5、SHA,即便是追加了salted的版本也不要选,因为这种普通的哈希函数计算速度很快,这样攻击者就可以在很短时间内执行成百上千次的攻击。spring提供的org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder类是一个不错的选择,因为Bcrypt故意设计的计算速度很慢,就是为了应对密码攻击。记住在生产环境里,即便我们的数据库很安全也不要考虑把密码存储成明文形式。
2.那么什么是哈希呢
对密码进行哈希处理并不是spring security特有的概念,而是安全系统的一个通用概念。哈希算法是个单向函数,对输入的数据(如密码)进行计算,输出一个固定长度的数据(哈希码),例如对password字符进行MD5哈希后得到如下结果
5f4dcc3b5aa765d61d8327deb882cf99
哈希算法是单向的有两个意思,一是根据计算后的哈希码很难得到原始的输入数据(基本上是不可能的),二是只要输入的数据一样得到的哈希码都是一样的。正是这两个特性使得这个算法非常适合用来存储认证用户的密码信息,这样即便是存储用户信息的数据库被破解了,也不能用里面的信息登录我们的系统。
3.在哈希算法中加入Salt
单纯利用hash对密码进行编码有一个潜在的问题,因为现在有很多的黑客网站直接有哈希码和原始数据的对应结果,例如我们把5f4dcc3b5aa765d61d8327deb882cf99放在百度、google上搜素,我们很快就知道原始数据是password。而在实际应用中,用户都倾向与选择很相似的密码。因而当黑客想要攻击我们的网站时,他可以建立一个常见密码对应的哈希码的字典表,从而通过哈希码找到原始的密码值。为了应对这个攻击,我们可以选择高强度的密码策略,如最少位数限制,密码组合中至少有特殊字符、数字和字符等组成,另一种就是在计算哈希码时利用一个salt,作为对密码哈希时的附加值。理想情况下这个salt值越随机越好,加入salt后,攻击者想要破解原始密码就需要为每一个salt创建一个字典表,使破解的难度大大加大。spring推荐用的Bcrypt算法会自动的为我们生成一个随机的salt,并以特定的格式存储在计算后的哈希码中。
4.哈希和认证
当认证提供者(例如DaoAuthenticationProvider)需要验证用户提交的密码是否正确时,如果存储的用户密码经过了哈希处理,那么用户提交的密码必须经过相同的哈希算法处理,这个需要应用的开发者自己保证,因为spring security并不关系用户信息是如何存入数据库的。并且这个两个算法必须严格一致,假如你知道用户信息存入时用的是MD5算法,因而你在spring security中用Md5PasswordEncoder来编码,有时候还是会有问题,比如数据库存入时用了Base 64来做MD5编码,而Md5PasswordEncoder却用了默认的十六进制编码这样还是不能正确认证,所以在系统正式启用之前一定要哈希算法的一致并能正常认证成功。spring security推荐我们在两个地方都统一采用bcrypt,这样可以避免不必要的麻烦。
发表评论
-
spring-security(二十五)鉴权
2018-03-27 11:21 1601前言 本文将详细探讨spring security中的鉴权 ... -
test
2018-03-19 21:20 0什么是服务发现 ... -
spring-security(二十四)CSRF
2018-03-24 09:54 81631.什么是CSRF攻击 下面我们以一个具体的例子来说明这种常见 ... -
spring-security(二十三)Remember-Me认证
2018-03-09 21:06 1340前言: Remember-me认证方式指的是能在不同的会话 ... -
spring-security(二十二)基本认证和摘要认证
2018-03-06 16:58 1804前言: 在web应用中,非常流行以基本认证和摘要认证作为备 ... -
spring-security(二十一)核心Filter-UsernamePasswordAuthenticationFilter
2018-03-04 11:05 1240一、UsernamePasswordAuthenticatio ... -
spring-security(二十)核心Filter-SecurityContextPersistenceFilter
2018-02-28 21:40 1132一、SecurityContextPersistenceFil ... -
spring-security(十九)核心Filter-ExceptionTranslationFilter
2018-02-27 16:31 2063前言: 在spring的安全 ... -
spring-security(十八)核心Filter-FilterSecurityInterceptor
2018-02-25 10:59 2350前言: 当用spring secur ... -
spring-security(二十六)整合CAS 实现SSO
2018-04-05 18:09 12451.cas 认证流程 2.spring security ... -
spring-security(十七)Filter顺序及简介
2018-02-22 18:16 7903前言: spring security在 ... -
spring-security(十六)Filter配置原理
2018-02-21 15:18 2387前言: spring security最常见的应用场景还是 ... -
spring-security(十四)UserDetailsService
2018-02-19 11:35 1474前言: 作为spring security的核心类,大多数 ... -
spring-security(十三)核心服务类
2018-02-18 16:46 1418前言: 在之前的篇章中我们已经讲述了spring secu ... -
spring-security(十二)鉴权方式概述
2018-02-18 10:42 2527前言: 本文主要讲述在spring security鉴权的 ... -
spring-security(十一)Web应用认证过程
2018-02-17 17:17 1238前言: 本文将探讨当 ... -
spring-security(十)基本认证过程
2018-02-17 13:55 2107前言: 在spring security中认证具体指的是什 ... -
spring-security(九)-核心组件
2018-02-17 10:46 869前言: 本文主要介绍在spring security中的几 ... -
spring-security(八)java config-sample之cas client
2018-02-16 11:26 2070前言: SSO英文全称Single Sign On,单点登 ... -
spring-security(七)java config-sample之concurrency
2018-02-15 10:51 673前言: 在实际应用中,我们可能会限制一个用户同时登录同一个 ...
相关推荐
Spring Boot Security是一个强大的工具,它集成了Spring Security框架,使得在Spring Boot应用中实现安全控制变得简单高效。Spring Security是一个全面的、可高度定制的安全框架,适用于Java Web应用程序,包括认证...
### Spring Security 4.0.1 核心知识点解析 #### 一、Spring Security 概览 ##### 1.1 什么是 Spring Security? Spring Security 是一个功能强大的安全框架,为基于 Java 的应用程序提供了全面的安全解决方案。...
Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理,它为Web和方法级的安全提供了全面的解决方案。在Spring Boot环境中,Spring Security 可以轻松集成并简化配置过程,使得开发者可以快速实现认证...
Spring Security 是一个强大的且高度可定制的身份验证和访问控制框架,用于保护Java应用程序。它最初被称为Acegi Security,后来在Spring 2.0版本后被重命名为Spring Security。本教程将引导你入门Spring Security 3...
Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理,它为Spring Boot提供了全面的安全服务。在本示例中,我们将探讨如何将Spring Security与Spring Boot整合,以实现一个基础的用户登录验证和权限...
Spring Security 参考 1 第一部分前言 15 1.入门 16 2.介绍 17 2.1什么是Spring Security? 17 2.2历史 19 2.3版本编号 20 2.4获得Spring安全 21 2.4.1使用Maven 21 Maven仓库 21 Spring框架 22 2.4.2 Gradle 23 ...
SpringBoot-Security是基于Spring Boot的轻量级安全框架,用于简化Spring Security的集成和配置。这个框架使得在Spring Boot应用中实现身份验证和授权变得简单。本文将深入探讨SpringBoot-Security的两种配置方式...
import org.springframework.security.crypto.password.PasswordEncoder; public class CustomPasswordEncoder implements PasswordEncoder { private final BCryptPasswordEncoder bCryptPasswordEncoder = new ...
SpringSecurity 是一个强大的Java安全框架,用于保护Web应用程序免受各种攻击。在SpringSecurity 3.1版本中,相比3.0版本,配置上有一些变化,但其核心仍然是通过一系列过滤器来实现安全控制。本文将详细介绍Spring...
<beans:bean id="myAccessDecisionManagerBean" class="springSecurity.MyAccessDecisionManager"> <!-- 配置项 --> <!-- 安全元数据源 --> <beans:bean id="securityMetadataSource" class="springSecurity....
# Spring Security 3.0.3 知识点解析 ## 一、Spring Security 概览 ### 1.1 什么是 Spring Security? Spring Security 是一个功能强大的安全框架,为基于 J2EE 的企业级软件应用程序提供全面的安全解决方案。它...
在压缩包文件"SpringSecurity3"中,可能包含了以下内容: - `spring-security.xml`:这是主要的配置文件,包含了上述提到的所有配置。 - `web.xml`:可能包含了Spring Security过滤器链的配置,以便在Web应用启动时...
在本文中,我们将深入探讨如何使用Spring Boot和Spring Security实现基于基本身份验证(Basic Authentication)的安全RESTful API。Spring Boot简化了创建独立、生产级别的基于Spring的应用程序,并且Spring ...
从提供的文件信息中,我们可以提取出几个关键词:Spring Security,这是Java企业级开发中非常重要的一个安全框架。标题和描述表明,文件的内容与Spring Security的详细讲解有关。具体来说,可以推测文档中将涵盖...
在IT行业中,Spring Boot和Spring Security是两个非常重要的框架,它们在构建现代Web应用程序时起着核心作用。JWT(Json Web Token)则是一种安全的身份验证机制,被广泛应用于微服务架构和API授权。本篇文章将深入...
Spring Security 是一个强大的Java安全框架,用于保护基于Spring的应用程序。它提供了全面的身份验证、授权和访问控制功能,使得开发者可以轻松地实现安全控制。在本文中,我们将深入探讨Spring Security 3的配置...
Spring Security实现变体创建该存储库是为了探索Spring安全性的不同实现(请参阅分支)主枝Main分支使用默认的Spring安全配置使用基本身份验证。 要执行登录,您应该使用默认的用户名-user和启动时生成的密码(请...
### Spring Security配置实例详解 #### 一、Spring Security简介与应用场景 Spring Security 是一个功能强大的安全框架,提供了全面的安全服务,支持认证、授权以及其他安全服务。它为开发人员提供了高度可定制化...