`

spring-security(十五) Password编码

阅读更多
前言:
  在实际应用中,如果我们直接把密码以明文形式存储在数据库中存在一定的安全隐患。所以最好以某中方式将密码编码后再存储下来,用户登录时将用户输入的密码也按照相同的编码方式编码后和数据库中存储的密码相比较,即可以完成验证,也保证了密码等敏感信息的安全性。
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-boot-security

    Spring Boot Security是一个强大的工具,它集成了Spring Security框架,使得在Spring Boot应用中实现安全控制变得简单高效。Spring Security是一个全面的、可高度定制的安全框架,适用于Java Web应用程序,包括认证...

    spring-security-reference-4.0.1

    ### Spring Security 4.0.1 核心知识点解析 #### 一、Spring Security 概览 ##### 1.1 什么是 Spring Security? Spring Security 是一个功能强大的安全框架,为基于 Java 的应用程序提供了全面的安全解决方案。...

    spring-security.rar

    Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理,它为Web和方法级的安全提供了全面的解决方案。在Spring Boot环境中,Spring Security 可以轻松集成并简化配置过程,使得开发者可以快速实现认证...

    spring-security入门

    Spring Security 是一个强大的且高度可定制的身份验证和访问控制框架,用于保护Java应用程序。它最初被称为Acegi Security,后来在Spring 2.0版本后被重命名为Spring Security。本教程将引导你入门Spring Security 3...

    spring-security结合spring boot超简单的例子

    Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理,它为Spring Boot提供了全面的安全服务。在本示例中,我们将探讨如何将Spring Security与Spring Boot整合,以实现一个基础的用户登录验证和权限...

    spring security 参考手册中文版

    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

    SpringBoot-Security是基于Spring Boot的轻量级安全框架,用于简化Spring Security的集成和配置。这个框架使得在Spring Boot应用中实现身份验证和授权变得简单。本文将深入探讨SpringBoot-Security的两种配置方式...

    Spring security 自定义密码加密方式的使用范例。

    import org.springframework.security.crypto.password.PasswordEncoder; public class CustomPasswordEncoder implements PasswordEncoder { private final BCryptPasswordEncoder bCryptPasswordEncoder = new ...

    用SpringSecurity保护Web的安全

    SpringSecurity 是一个强大的Java安全框架,用于保护Web应用程序免受各种攻击。在SpringSecurity 3.1版本中,相比3.0版本,配置上有一些变化,但其核心仍然是通过一系列过滤器来实现安全控制。本文将详细介绍Spring...

    spring security3配置

    <beans:bean id="myAccessDecisionManagerBean" class="springSecurity.MyAccessDecisionManager"> <!-- 配置项 --> <!-- 安全元数据源 --> <beans:bean id="securityMetadataSource" class="springSecurity....

    Spring Security 3.0.3

    # Spring Security 3.0.3 知识点解析 ## 一、Spring Security 概览 ### 1.1 什么是 Spring Security? Spring Security 是一个功能强大的安全框架,为基于 J2EE 的企业级软件应用程序提供全面的安全解决方案。它...

    Spring Security3 简单demo

    在压缩包文件"SpringSecurity3"中,可能包含了以下内容: - `spring-security.xml`:这是主要的配置文件,包含了上述提到的所有配置。 - `web.xml`:可能包含了Spring Security过滤器链的配置,以便在Web应用启动时...

    spring-boot-basic-auth:使用基本身份验证的安全Spring Boot REST API

    在本文中,我们将深入探讨如何使用Spring Boot和Spring Security实现基于基本身份验证(Basic Authentication)的安全RESTful API。Spring Boot简化了创建独立、生产级别的基于Spring的应用程序,并且Spring ...

    2016 page220 Spring Security Essentials - Nanda Nachimuthu.pdf )

    从提供的文件信息中,我们可以提取出几个关键词:Spring Security,这是Java企业级开发中非常重要的一个安全框架。标题和描述表明,文件的内容与Spring Security的详细讲解有关。具体来说,可以推测文档中将涵盖...

    SpringBoot-JWT-Token:JWT令牌,Spring-Security

    在IT行业中,Spring Boot和Spring Security是两个非常重要的框架,它们在构建现代Web应用程序时起着核心作用。JWT(Json Web Token)则是一种安全的身份验证机制,被广泛应用于微服务架构和API授权。本篇文章将深入...

    SpringSecurity 3配置文件

    Spring Security 是一个强大的Java安全框架,用于保护基于Spring的应用程序。它提供了全面的身份验证、授权和访问控制功能,使得开发者可以轻松地实现安全控制。在本文中,我们将深入探讨Spring Security 3的配置...

    spring-security-variants

    Spring Security实现变体创建该存储库是为了探索Spring安全性的不同实现(请参阅分支)主枝Main分支使用默认的Spring安全配置使用基本身份验证。 要执行登录,您应该使用默认的用户名-user和启动时生成的密码(请...

    spring security配置实例

    ### Spring Security配置实例详解 #### 一、Spring Security简介与应用场景 Spring Security 是一个功能强大的安全框架,提供了全面的安全服务,支持认证、授权以及其他安全服务。它为开发人员提供了高度可定制化...

Global site tag (gtag.js) - Google Analytics