springsecurity初体验(5.3.5官方文档)-1

本文深入探讨了Spring Security的密码存储机制,包括DelegatingPasswordEncoder的使用和BCryptPasswordEncoder的配置。此外,文章讲解了Spring Security如何防止CSRF攻击,通过同步令牌模式和设置SameSite属性来增强安全性。还提到了HTTP响应头的安全性,如Content Security Policy、X-Frame-Options等,以及如何防止XSS和CSRF攻击。最后,简述了Spring Security的模块划分和启动项目的基本步骤。
摘要由CSDN通过智能技术生成

5.1.2 密码存储
PasswordEncoder,5.0之前默认的NoOpPasswordEncoder ,框架用了DelegatingPasswordEncoder模式,方便将来更新存储方式的时候不用变动框架。
创建委托:

PasswordEncoder passwordEncoder =
    PasswordEncoderFactories.createDelegatingPasswordEncoder();

创建自定义的委托:

String idForEncode = "bcrypt";
Map encoders = new HashMap<>();
encoders.put(idForEncode, new BCryptPasswordEncoder());
encoders.put("noop", NoOpPasswordEncoder.getInstance());
encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());
encoders.put("scrypt", new SCryptPasswordEncoder());
encoders.put("sha256", new StandardPasswordEncoder());

PasswordEncoder passwordEncoder =
    new DelegatingPasswordEncoder(idForEncode, encoders);

DelegatingPasswordEncoder存储方式

{id}encodedPassword

举例:

{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG 
{noop}password 
{pbkdf2}5d923b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4d6b99ca763d8dc 
{scrypt}$e0801$8bWJaSu2IKSn9Z9kM+TPXfOc/9bdYSrN1oD9qfVThWEwdRTnO7re7Ei+fUZRJ68k9lTyuTeUp4of4g24hHnazw==$OAOec05+bXxvuu/1qZ6NUR+xQYvYv7BeL1QxwRpY5Pc=  
{sha256}97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0 

传递给构造函数的idForEncode确定将使用哪个PasswordEncoder编码密码。 在上面我们构造的DelegatingPasswordEncoder中,这意味着编码密码的结果将委派给BCryptPasswordEncoder并以{bcrypt}为前缀。
密码匹配:
默认的调用matches(CharSequence, String)如果不传递{id}会抛出IllegalArgumentException,需要设置默认来解决,DelegatingPasswordEncoder.setDefaultPasswordEncoderForMatches(PasswordEncoder)。建议使用最新的加密算法。
简单起步,不适合生产

User user = User.withDefaultPasswordEncoder()
  .username("user")
  .password("password")
  .roles("user")
  .build();
System.out.println(user.getPassword());
// {bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG

可以复用build构建多个用户,尽管仍然会对密码进行哈希,但是不是安全的。

BCryptPasswordEncoder 设置强度

// Create an encoder with strength 16
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(16);
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result));

SS(spring security) 默认使用 DelegatingPasswordEncoder ,但是,也可以自定义PasswordEncoder 作为一个bean。如果是老项目迁移,就可以设置一个NoOpPasswordEncoder 的bean。但还是不建议,不安全。

@Bean
public static NoOpPasswordEncoder passwordEncoder() {
   
    return NoOpPasswordEncoder.getInstance();
}

5.2 漏洞保护
尽可能多的提供了默认保护。
5.2.1 Cross Site Request Forgery (CSRF) 跨域请求伪造
例如访问了一个银行网站,没有登出,然后访问一个恶意网站,里面包含转账脚本。这是由于尽管恶意网站看不到你的cookie,但是requet中仍然包含了银行信息。甚至访问一个正常网站时候,如果该网站是XSS攻击受害者,也会发生类似事情。
CSRF攻击的可能原因是受害者网站的HTTP请求与攻击者网站的请求完全相同。为了防御CSRF攻击,我们需要确保恶意站点无法提供请求中的某些内容,以便我们区分这两个请求。
SS提供两种方式防止CSRF攻击
同步token pattern
cookie会话中指明SameSite Attribute
为了使针对CSRF的任何一种保护都起作用,应用程序必须确保“安全” HTTP方法是幂等的。这意味着使用HTTP方法GET,HEAD,OPTIONS和TRACE的请求不应更改应用程序的状态。

最主要,最全面的防御方式就是Synchronizer Token Pattern,该解决方案是为了确保每个HTTP请求除了我们的会话cookie之外,还必须在HTTP请求中包含一个安全的,随机生成的值,称为CSRF令牌。
提交HTTP请求时,服务器必须查找预期的CSRF令牌,并将其与HTTP请求中的实际CSRF令牌进行比较。如果值不匹配,则应拒绝HTTP请求。
这项工作的关键在于,实际的CSRF令牌应该位于浏览器不会自动包含的HTTP请求的一部分中。 例如,在HTTP参数或HTTP标头中要求实际的CSRF令牌将防止CSRF攻击。 在cookie中要求实际CSRF令牌不起作用,因为浏览器会自动将cookie包含在HTTP请求中。
我们不想在HTTP GET中包含随机令牌,因为这可能导致令牌泄漏。
让我们看一下使用同步令牌模式时示例将如何变化。假设实际的CSRF令牌必须位于名为_csrf的HTTP参数中。我们应用程序的转帐表格如下:

<form method="post"
    action="/transfer">
<input type="hidden"
    name="_csrf"
    value="4bfd1575-3ad1-4d21-96c7-4ef2d9f86721"/>
<input type="text"
    name="amount"/>
<input type="text"
    name="routingNumber"/>
<input type="hidden"
    name="account"/>
<input type="submit"
    value="Transfer"/>
</form>

现在,该表单包含具有CSRF令牌值的隐藏输入。外部站点无法读取CSRF令牌,因为同源策略可确保恶意站点无法读取response。相应的HTTP汇款请求如下所示:

POST /transfer HTTP/1.1
Host: bank.example.com
Cookie: JSESSIONID=randomid
Content-Type: application/x-www-form-urlencoded

amount=100.00&routingNumber=1234&account=9876&_csrf=4bfd1575-3ad1-4d21-96c7-4ef2d9f86721

您会注意到,HTTP请求现在包含带有安全随机值的_csrf参数。 恶意网站将无法为_csrf参数提供正确的值(必须在邪恶网站上明确提供),并且当服务器将实际CSRF令牌与预期CSRF令牌进行比较时,传输将失败。

SameSite Attribute
一种防止CSRF攻击的新兴方法是在cookie上指定SameSite属性。设置cookie时,服务器可以指定SameSite属性,以指示从外部站点发出时不应发送该cookie。
Spring Security不直接控制会话cookie的创建,因此不提供对SameSite属性的支持。 Spring Session在基于servlet的应用程序中为SameSite属性提供支持。 Spring Framework的CookieWebSessionIdResolver为基于WebFlux的应用程序中的SameSite属性提供了开箱即用的支持。
一个示例,带有SameSite属性的HTTP响应标头可能类似于:

Set
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值