当前位置: 首页 > wzjs >正文

北京做网站的网络公司百度第三季度财报2022

北京做网站的网络公司,百度第三季度财报2022,网站后台发文章图片链接怎么做,b2b和b2c平台有哪几个Spring security详细上手教学(三)密码管理 本章节两部分内容 实现PasswordEncoder使用Spring Security Crypto模块提供的工具 1. 使用 password encoder 通常,系统不会使用纯文本来保存密码,需要进行加密/哈希等一系列处理以加…

Spring security详细上手教学(三)密码管理

本章节两部分内容

  • 实现PasswordEncoder
  • 使用Spring Security Crypto模块提供的工具

1. 使用 password encoder

通常,系统不会使用纯文本来保存密码,需要进行加密/哈希等一系列处理以加强安全性。Spring Security将这一部分功能抽象为PasswordEncoder接口

1.1 PasswordEncoder 约束

public interface PasswordEncoder {String encode(CharSequence rawPassword);boolean matches(CharSequence rawPassword, String encodedPassword);default boolean upgradeEncoding(String encodedPassword) {return false;}
}
  • encode() 方法用来对密码进行加密
  • matches() 方法检查输入的密码与加密后的密码是否匹配。
  • upgradeEncoding() 方法默认是返回false,如果你设置为true,那么密码将会在加密后再次加密,增加安全性。

1.2 实现PasswordEncoder接口

如下代码,实现了一个简单的明文密码处理逻辑。

public class PlainTextPasswordEncoder implements PasswordEncoder {@Overridepublic String encode(CharSequence rawPassword) {return rawPassword.toString();}@Overridepublic boolean matches(CharSequence rawPassword, String encodedPassword) {return rawPassword.toString().equals(encodedPassword);}
}
public class Sha512PasswordEncoder implements PasswordEncoder {@Overridepublic String encode(CharSequence rawPassword) {return hashWithSHA512(rawPassword.toString());}@Overridepublic boolean matches(CharSequence rawPassword, String encodedPassword) {String hashedPassword = hashWithSHA512(rawPassword.toString());return encodedPassword.equals(hashedPassword);}private String hashWithSHA512(String input) {StringBuilder result = new StringBuilder();try {MessageDigest md = MessageDigest.getInstance("SHA-512");byte[] hashBytes = md.digest(input.getBytes());for (byte b : hashBytes) {result.append(0xFF & b);}} catch (NoSuchAlgorithmException e) {throw new RuntimeException(e);}return result.toString();}
}

1.3 选择预置的PasswordEncoder

  • NoOpPasswordEncoder——不加密,仅用作例子
  • StandardPasswordEncoder——使用SHA256对密码进行哈希处理。目前认为这种方式的安全性不够了。
  • Pbkdf2PasswordEncoder——使用基于密钥的密码推导函数
  • BCryptPasswordEncoder——使用bcrypt强哈希函数对密码进行加密
  • SCryptPasswordEncoder——使用scrypt哈希函数对密码进行加密

1.4 DelegatingPasswordEncode的多加密策略

使用场景。比如之前的密码策略不再安全了,需要升级密码哈希算法,但是旧的用户身份验证不想做更改。就可以使用DelegatingPasswordEncode。

DelegatingPasswordEncode使用一个map来存储不同的PasswordEncoder算法实现

生成的哈希码前缀带有使用加密算法的名字。

image-20250427093029751

    @Beanpublic PasswordEncoder DelegatingPasswordEncoder() {Map<String, PasswordEncoder> encoders = new HashMap<>();encoders.put("noop", NoOpPasswordEncoder.getInstance());encoders.put("bcrypt", new BCryptPasswordEncoder());encoders.put("scrypt", SCryptPasswordEncoder.defaultsForSpringSecurity_v5_8());return new DelegatingPasswordEncoder("bcrypt", encoders);}

PasswordEncoderFactories.createDelegatingPasswordEncoder()方法可以提供一个包含全部PasswordEncoder实现的实例,这个实例默认采用bcrypt算法。

2. 利用Spring Security的密码工具

2.1 使用密钥生成器

”charitalics“ 密钥生成器用于各类哈希、加密算法中生成特定密钥。Spring Security已经封装了很好用的密钥生成器工具,书的作者推荐我们有限使用Spring Security而不是第三方的依赖。

密钥生成器有两个接口:BytesKeyGenerator和StringKeyGenerator。我们可以直接用工厂类KeyGenerators创建他们。我们可以用StringKeyGenerator生成一个字符串的密钥,通常可以用给哈希算法加“盐”或者用于加密算法。

public interface StringKeyGenerator {String generate Key();
}

如下代码通过KeyGenerators获取StringKeyGenerator,然后生成密钥

StringKeyGenerator keyGenerator = KeyGenerators.string();
String salt = keyGenerator.generateKey();

BytesKeyGenerator定义如下

public interface BytesKeyGenerator {int getKeyLength();byte[] generateKey();
}

BytesKeyGenerator另外一个方法是返回key的长度,默认生成key是8字节长度的,如下代码所示

BytesKeyGenerator keyGenerator = KeyGenerators.secureRandom();
byte[] salt = keyGenerator.generateKey();
int keyLength = keyGenerator.getKeyLength();

如果你需指定key的长度,可以这样

BytesKeyGenerator keyGenerator = KeyGenerators.secureRandom(16);

上面我们使用secureRandom方法获取的生成器每次生成的密钥都是不同的。有些时候我们希望每次生成一致的key,那么我们可以使用shared()方法,如下

BytesKeyGenerator keyGenerator = KeyGenerators.shared(16);

2.2 使用encryptors进行加解密

有时候我们需要对发送数据进行加密,涉及到两个类型的接口,BytesEncryptor和TextEncrytor

其中BytesEncrytor更加通用一些

public interface BytesEncryptor {byte[] encrypt(byte[] byteArray);byte[] decrypt(byte[] encryptedByteArray);
}

下面我们通盘看下如何使用的

String salt = KeyGenerators.string().generateKey();
String password = "password";
String valueToEncrypt = "HELLO";BytesEncryptor encoder = Encryptors.standard(password, salt);
byte[] encrypted = encoder.encrypt(valueToEncrypt.getBytes());
byte[] decrypted = encoder.decrypt(encrypted);

standard的字节加密使用256位的AES加密算法。

BytesEncryptor encoder = Encryptors.stronger(password, salt);

stronger方法,使用256位的AES加密算法时,采用了伽罗瓦/计数器模式(GCM)作为加密模式;而标准版本使用密码块链(CBC)。

TextEncryptors有三种实例的创建方法,Encryptors.text(), Encryptors.delux(), Encryptors.queryableText()

此外还可以使用Encryptors.noOpTest()方法,创建一个不加密的方法用作测试Demo等

String valueToEncrypt = "HELLO";
TextEncryptor e = Encryptors.noOpText();
String encrypted = e.encrypt(valueToEncrypt);

Encryptors.text()底层还是使用的Encryptors.standard方法
Encryptors.delux()底层使用的是Encryptors.stronger方法

http://www.dtcms.com/wzjs/161288.html

相关文章:

  • 网站如何做百度才会收录长沙网站公司品牌
  • 品牌定位 品牌上海抖音seo公司
  • 上海网站建设定制公微博关键词排名优化
  • 湖南长沙天气seo排名点击 seo查询
  • 编程 朋友 做网站百度竞价点击价格
  • 合肥市建设工程造价信息网站推广哪个网站好
  • 文山微网站建设站长工具免费
  • 武汉关键词排名提升搜索引擎优化趋势
  • 网页游戏网站开发人工智能培训机构排名
  • 切实加强政府门户网站建设网络seo是什么意思
  • 手机app开发网站模板资源优化网站排名
  • 长春精神文明建设网站百度商业账号登录
  • 冀州网站制作公众号关键词排名优化
  • 大型网站 div百度网盘app官网下载
  • 创个网站怎么弄全网搜索
  • 人才招聘网站建设方案深圳推广不动产可视化查询
  • 商城类网站如何众筹品牌推广经典案例
  • 天津市建设工程交易管理网站东营网站建设制作
  • wordpress 做大型网站吗google play官网
  • 厦门 微网站制作百度推广账户优化方案
  • 昆山做网站多少钱湖南seo优化排名
  • 做招聘网站的客户想退钱知了seo
  • 南宁网站定制google开户
  • 网站建设网站建设清理大师
  • 编程网站项目做哪个比较好成都网站建设软件
  • 家具网页设计素材搜狗seo快速排名公司
  • 养殖场在哪个网站做环评备案环球网疫情最新
  • 宁波设计网站公司公司官网制作多少钱
  • 网站推广托管公司今日刚刚发生的军事新闻
  • 菏泽做网站电话html简单网页成品