第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

加密模塊

1. 前言

我們知道安全性的實現(xiàn)往往少不了加解密的參與,Spring Security 加密模塊支持對稱加密、秘鑰生成和密碼編碼。這些代碼被發(fā)布在 Spring Security 核心模塊當(dāng)中,與其他模塊或代碼之間零耦合。

本節(jié)主要討論 Spring Security 中的加密模塊。

圖片描述

2. 加密器

加密器的相關(guān)類提供了構(gòu)造對稱加密器的工廠方法。通過該類,我們可以創(chuàng)建 ByteEncryptor 用于加密原始字節(jié)流內(nèi)容,我們也可以構(gòu)建出 TextEncryptor 用于加密文本字符串,這些加密器都是線程安全的。

2.1 BytesEncryptor

BytesEncryptor 是通過 Encryptors.stronger 工廠方法構(gòu)造出的:

Encryptors.stronger("password", "salt");

stronger 加密方法構(gòu)造了一個使用GCM模式的 256 位 AES 算法加密器。它使用 PKCS #5 的 PBKDF2(基于密碼的密鑰派生函數(shù) #2)導(dǎo)出密鑰(此方法需要 Java 6)。方法中 password 參數(shù)用于生產(chǎn)加密密鑰,它將被保存在一個不被共享的安全區(qū)域。salt 參數(shù)用于避免字典攻擊。除此之外,此處還應(yīng)用了 16 字節(jié)的隨機(jī)初始化向量來保證每個加密消息都是唯一的。

salt 參數(shù)的是一個 16 禁止編碼字符串,具有隨機(jī)性,至少有 8 位長,salt 可以通過以下方式生成:

String salt = KeyGenerators.string().generateKey(); // 生成一個隨機(jī) 8 位長的 16 進(jìn)制字符串

我們也可以使用標(biāo)準(zhǔn)加密方法,即 CBC 模式的 256 位 AES 算法加密模式。這種模式不需要通過身份認(rèn)證,也無法保證數(shù)據(jù)的真實性,相對 Encryptors.stronger 來說安全性會低一些。

2.2 TextEncryptor

使用 Encryptors.text 工廠方法構(gòu)造標(biāo)準(zhǔn)的文本加密器 TextEncryptor

Encryptors.text("password", "salt");

TextEncryptor 使用的是標(biāo)準(zhǔn) BytesEncryptor 來加密文本數(shù)據(jù),加密的結(jié)果以 16 進(jìn)制編碼字符串形式返回,這樣容易被文件系統(tǒng)或數(shù)據(jù)庫保存。

我們也可以使用 Encryptors.queryableText 工廠方法構(gòu)建可查詢的文本加密器:

Encryptors.queryableText("password", "salt");

這兩種加密器間的區(qū)別是擁有不同的初始化向量(iv)處理。在可查詢文本加密器中,初始化向量是可共享的、固定的,并且不是隨機(jī)生成的。這意味著相同的文本內(nèi)容多次被加密的結(jié)果是相同的。這樣的場景的安全性相對較低,但有時為了加密出的結(jié)果是有規(guī)律的,比如希望他仍然可以被再次查詢到,還是需要用到這樣的加密方式??刹樵兾谋炯用芷鞯氖褂脠鼍坝腥?OAuth 的 apiKey。

3. 秘鑰生成器

密鑰生成器(KeyGenerators)提供了一些工廠方法,用于構(gòu)造不同類型的密鑰生成器。例如 BytesKeyGenerator 可用于生產(chǎn) byte[] 類型密鑰。StringKeyGenerator 用于生成字符串類型密鑰。密鑰生成器是線程安全的。

3.1 BytesKeyGenerator

使用 KeyGenerators.secureRandom 工廠方法構(gòu)造 BytesKeyGenerator 實例:

BytesKeyGenerator generator = KeyGenerators.secureRandom();
byte[] key = generator.generateKey();

默認(rèn)配置下,生成的 key 長度為 8 位,我們也可以為 secureRandom 設(shè)置參數(shù)來修改生成密鑰長度:

KeyGenerators.secureRandom(16);

使用 KeyGenerators.shared 工廠方法構(gòu)造 BytesKeyGenerator 可以使多次生成的密鑰內(nèi)容相同。

KeyGenerators.shared(16);

3.2 StringKeyGenerator

使用 KeyGenerators.string 工廠方法可以構(gòu)造 8 為長的隨機(jī) 16 禁止字符串密碼:

KeyGenerators.string();

4. 密碼編碼

在 Spring Security 加密模塊中,password 包提供了編碼密碼的方法。PasswordEncoder 是其中的核心類:

public interface PasswordEncoder {
	String encode(String rawPassword);
	boolean matches(String rawPassword, String encodedPassword);
}

matches 方法用來判斷密碼原文在經(jīng)過一次編碼后,與密碼密文是否匹配,這個方法用于基于密碼認(rèn)證的場景。

最常見的實現(xiàn)類是 BCryptPasswordEncoder,它使用了 bcrypt 算法來散列密碼。Bcrypt 使用了一個隨機(jī) 16 位鹽值,用于制造冗余,以防止密碼被破解。冗余次數(shù)可以通過 strength 參數(shù)設(shè)置,其值為 4~31 之間,值約高,散列次數(shù)越多,默認(rèn)值為 10。

// 構(gòu)造一個強(qiáng)度為 16 的密碼加密器
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(16);
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result));

Pbkdf2PasswordEncoder 實現(xiàn)了 PBKDF2 算法用來散列密碼。該算法為了防止被破解,有意的減慢了執(zhí)行時間,大概需要 0.5 秒完成密碼的驗證。

// 創(chuàng)建一個 PBKDF2 算法的密碼加密器
Pbkdf2PasswordEncoder encoder = new Pbkdf2PasswordEncoder();
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result));

5. 小結(jié)

本節(jié)討論了 Spring Security 安全框架中的加解密實現(xiàn),主要內(nèi)容有:

  • Spring Security 在核心模塊中包含了一個關(guān)于加密算法的包,其包含了加密、密鑰生成、密碼編碼三個主要功能;
  • Spring Security 的加密主要分基于 byte[] 對象的加密和文本形式的加密;
  • Spring Security 的加密可分為冪等的和非冪等的,其分別有各自的應(yīng)用場景;
  • Spring Security 對密碼的加密采取了有意拖延的方式,防止密碼被暴力破解。

下節(jié)討論在 Spring Security 項目中,如何實現(xiàn)單元測試。