Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
、Mybatis.xml
<update id="changePassword" parameterType="string">
<!--id要與抽象方法的方法名保持一致,否則會(huì)報(bào)錯(cuò) -->
UPDATE user
SET
<if test="password!=null">
password=#{password}
</if>
WHERE id=#{id}
</update>
二、Mapper
//修改密碼
public int changePassword(String password,Integer id);
三、Service
//修改密碼
public int changePassword(String new_password,Integer id) throws Exception{
int res=userMapper.changePassword(new_password,id);
return res;
}
四、Controller
這里面使用Shiro獲取登錄用戶(hù)信息,使用CryptographyUtil.md5進(jìn)行加密。
//修改密碼
@ResponseBody
@RequestMapping("/changepassword")
public JSONObject changePassword1(String old_password, String new_password) throws Exception{
JSONObject result = new JSONObject();
//根據(jù)用戶(hù)id查詢(xún)到用戶(hù)的信息
User user = (User) SecurityUtils.getSubject().getSession().getAttribute("currentUser");
if (user!=null){
String md5password = CryptographyUtil.md5(old_password, "java");
if (user.getPassword().equals(md5password)){
String newmd5 =CryptographyUtil.md5(new_password,"java");
System.out.println(newmd5);
int res=userService.changePassword(newmd5,user.getId());
result.put("success", true);
result.put("msg", "修改成功");
}else {
result.put("success", false);
result.put("msg", "原密碼不正確!");
}
}else {
result.put("success", false);
result.put("msg", "用戶(hù)名未找到!");
}
return result;
}
五、前端
線(xiàn)演示1
本地下載
在今天的jQuery教程中,我們將介紹如何使用jQuery和其它相關(guān)的插件來(lái)生成一個(gè)漂亮的帶有密碼強(qiáng)度檢驗(yàn)的注冊(cè)頁(yè)面,希望大家喜歡!
相關(guān)的插件和類(lèi)庫(kù)
complexify- 一個(gè)密碼強(qiáng)度檢驗(yàn)jQuery插件
justgage- 一個(gè)兼容性良好的儀表盤(pán)類(lèi)庫(kù)
主要功能
注冊(cè)中包含一個(gè)密碼強(qiáng)度檢驗(yàn)組件,用戶(hù)需要設(shè)置一定強(qiáng)度的密碼才可以注冊(cè)
密碼強(qiáng)度使用儀表盤(pán)類(lèi)庫(kù)justgage來(lái)顯示,不同的強(qiáng)度的密碼將顯示不同的顏色
密碼強(qiáng)度符合要求后,顯示注冊(cè)按鈕
代碼說(shuō)明
HTML:
<div id="page-wrap"><div id="title">注冊(cè)新賬號(hào) - gbtags.com</div><p><input type="text" name="email" id="email" placeholder="電子郵件"/></p><p><input type="password" name="password" id="password" placeholder="輸入密碼"/></p><div id="complexity"></div><p><input type="button" name="submit" id="submit" value="注冊(cè)" /></p><p id="msgbox"></p></div>
添加電子郵件和密碼輸入框,及其密碼強(qiáng)度組件。
Javascript:
導(dǎo)入所需的類(lèi)庫(kù),包括:
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script><script src="js/jquery.complexify.js"></script><script src="js/jquery.placeholder.min.js"></script><script src="js/raphael.2.1.0.min.js"></script><script src="js/justgage.1.0.1.min.js"></script>
以下為生成儀表盤(pán)及其密碼強(qiáng)度代碼:
$(function(){$('#submit').attr('disabled', true);var g1 = new JustGage({ id: "complexity", value: 0, min: 0, max: 100, title: "密碼強(qiáng)度提示", titleFontColor: '#9d7540', valueFontColor : '#CCCCCC', label: "points",levelColors: [ "#dfa65a", "#926d3b", "#584224"] ?});$('input[placeholder]').placeholder();$("#password").complexify({}, function(valid, complexity){if(valid){$('#submit').fadeIn();}else{$('#submit').fadeOut();}g1.refresh(Math.round(complexity));});$('#submit').click(function(){$('#msgbox').html('welcome to gbtags.com');});});
以上代碼中,我們使用JustGage生成需要的儀表盤(pán)。相關(guān)選項(xiàng)請(qǐng)參考代碼。
以下代碼中,我們使用complexify的回調(diào)方法來(lái)判斷用戶(hù)輸入的密碼強(qiáng)度是否符合要求:
$("#password").complexify({}, function(valid, complexity){if(valid){$('#submit').fadeIn();}else{$('#submit').fadeOut();}g1.refresh(Math.round(complexity));});
如果符合則顯示注冊(cè)按鈕,否則隱藏。同時(shí)刷新儀表盤(pán)的數(shù)值和顏色。
CSS代碼:
body{background: url('../images/body.png');}#container{background: url('../images/bg.jpg');padding: 30px;margin-top: 150px;box-shadow: 0px 0px 30px #9d7540;border-radius: 5px 5px 0px 0px;}#page-wrap{margin: 0 auto;width: 310px;text-align: center;font-size: 14px;padding:0px;font-family: Arial;}P{margin: 20px 0;padding:0;}#title{width: 292px;margin: 20px 0;font-size: 14px;font-weight: normal;font-family: Arial;color: #a27942;text-align:left;border-left: 4px solid #6e522d;border-right: 6px solid #303030;border-radius: 5px;padding: 12px 5px;background: #303030;box-shadow: 0px 0px 10px #4f3b20;}#msgbox{color: #808080;}input{width: 300px;height: 40px;box-shadow: 0px 0px 10px #4f3b20;border-radius: 5px;font-size: 14px;font-weight: normal;margin:0;padding: 0 5px;border: 1px solid #606060;font-family: Arial;background: #303030;color: #CCC;}#complexity{width: 302px;padding: 5px 5px;font-size: 18px;font-weight: bold;margin: 0px;box-shadow: 0px 0px 10px #4f3b20;border-radius: 5px;color:#CCC;background: #303030;}#submit{display: none;width: 310px;}#gbin1{padding: 15px 0px;text-align: center;background: #101010;color: #909090;font-size:12px;font-family: Arial;border-radius: 0px 0px 5px 5px;box-shadow: 0px 0px 20px #4f3b20;}#gbin1 a{font-family: Arial;font-size:12px;color: #909090;text-shadow: 1px 1px 25px #fff;text-decoration: none;}
代碼書(shū)寫(xiě)完畢,如果需要查看完整代碼,請(qǐng)下載演示。希望大家喜歡這個(gè)實(shí)現(xiàn)!如果你有任何意見(jiàn)和建議請(qǐng)給我們留言,謝謝!
原文鏈接:http://www.gbtags.com/gb/share/5889.htm
pring Security的PasswordEncoder接口用于執(zhí)行密碼單向的轉(zhuǎn)換,以允許安全地存儲(chǔ)密碼。假定PasswordEncoder是單向轉(zhuǎn)換,那么當(dāng)密碼轉(zhuǎn)換需要雙向轉(zhuǎn)換時(shí)(例如,存儲(chǔ)用于向數(shù)據(jù)庫(kù)進(jìn)行身份驗(yàn)證的憑證),就不需要使用它。通常,PasswordEncoder用于存儲(chǔ)需要在身份驗(yàn)證時(shí)與用戶(hù)提供的密碼進(jìn)行比較的密碼。
經(jīng)過(guò)多年的發(fā)展,存儲(chǔ)密碼的標(biāo)準(zhǔn)機(jī)制已經(jīng)形成。一開(kāi)始密碼是以明文形式存儲(chǔ)的。密碼被認(rèn)為是安全的,因?yàn)閿?shù)據(jù)存儲(chǔ)的密碼保存在訪(fǎng)問(wèn)它所需的憑證中。然而,惡意用戶(hù)能夠通過(guò)使用SQL注入等攻擊找到獲取大量用戶(hù)名和密碼“轉(zhuǎn)儲(chǔ)”的方法。隨著越來(lái)越多的用戶(hù)憑證成為公共安全事件,專(zhuān)家意識(shí)到我們需要做更多的工作來(lái)保護(hù)用戶(hù)的密碼。
然后,開(kāi)發(fā)人員被鼓勵(lì)通過(guò)單向哈希(例如SHA-256)來(lái)存儲(chǔ)密碼。當(dāng)用戶(hù)試圖進(jìn)行身份驗(yàn)證時(shí),將哈希密碼與他們鍵入的密碼的哈希進(jìn)行比較。這意味著系統(tǒng)只需要存儲(chǔ)密碼的單向哈希。如果發(fā)生了入侵,那么只有密碼哈希被暴露了。由于哈希是一種算法,而且根據(jù)哈希來(lái)猜測(cè)密碼在計(jì)算上非常困難,因此不值得花力氣去找出系統(tǒng)中的每個(gè)密碼。為了破解這種方式,惡意用戶(hù)決定創(chuàng)建稱(chēng)為彩虹表(https://en.wikipedia.org/wiki/Rainbow_table)的查找表。他們不是每次都猜測(cè)每個(gè)密碼,而是計(jì)算一次密碼并將其存儲(chǔ)在一個(gè)查找表中。
為了降低彩虹表的有效性,開(kāi)發(fā)者被鼓勵(lì)使用鹽值密碼。與僅僅使用密碼作為哈希函數(shù)的輸入不同,它將為每個(gè)用戶(hù)的密碼生成隨機(jī)字節(jié)(稱(chēng)為鹽值)。鹽值和用戶(hù)密碼將通過(guò)哈希函數(shù)運(yùn)行,該函數(shù)生成一個(gè)唯一的鹽值。鹽值將以明文形式與用戶(hù)密碼一起存儲(chǔ)。然后,當(dāng)用戶(hù)試圖進(jìn)行身份驗(yàn)證時(shí),將哈希密碼與存儲(chǔ)的鹽值的哈希值和用戶(hù)輸入的密碼進(jìn)行比較。獨(dú)特的鹽值意味著彩虹表不再有效,因?yàn)槊糠N鹽值和密碼組合的哈希值是不同的。
在現(xiàn)代,我們意識(shí)到加密散列(如SHA-256)不再安全。原因是,用現(xiàn)代硬件,我們可以在一秒鐘內(nèi)執(zhí)行數(shù)十億次哈希計(jì)算。這意味著我們可以輕松地破解每個(gè)密碼。
現(xiàn)在鼓勵(lì)開(kāi)發(fā)人員利用自適應(yīng)單向函數(shù)來(lái)存儲(chǔ)密碼。使用自適應(yīng)單向函數(shù)進(jìn)行密碼驗(yàn)證是有意的資源密集型(即CPU、內(nèi)存等)。一個(gè)自適應(yīng)單向函數(shù)允許配置一個(gè)“工作因子”,它可以隨著硬件變得更好而增長(zhǎng)。建議將“工作因子”調(diào)整為在您的系統(tǒng)上花費(fèi)大約1秒的時(shí)間來(lái)驗(yàn)證密碼。這樣做的好處是讓攻擊者很難破解密碼,但又不至于讓自己的系統(tǒng)負(fù)擔(dān)過(guò)重。Spring Security試圖為“工作因子”提供一個(gè)良好的起點(diǎn),但是鼓勵(lì)用戶(hù)為自己的系統(tǒng)定制“工作因子”,因?yàn)椴煌到y(tǒng)的性能會(huì)有很大的不同。應(yīng)該使用的自適應(yīng)單向函數(shù)示例包括bcrypt、PBKDF2、scrypt和argon2。
由于自適應(yīng)單向函數(shù)有意地需要大量資源,因此為每個(gè)請(qǐng)求驗(yàn)證用戶(hù)名和密碼將顯著降低應(yīng)用程序的性能。Spring Security(或任何其他庫(kù))都無(wú)法加速密碼的驗(yàn)證,因?yàn)榘踩允峭ㄟ^(guò)密集的驗(yàn)證資源來(lái)獲得的。鼓勵(lì)用戶(hù)交換長(zhǎng)期憑證(如用戶(hù)名和密碼)為短期憑據(jù)(如會(huì)話(huà),OAuth令牌,等)。可以快速驗(yàn)證短期憑證,而不會(huì)損失任何安全性。
在Spring Security 5.0之前,默認(rèn)的PasswordEncoder是NoOpPasswordEncoder,它需要純文本密碼。根據(jù)密碼歷史部分,您可能認(rèn)為默認(rèn)的PasswordEncoder現(xiàn)在類(lèi)似于BCryptPasswordEncoder。
然而,這忽略了三個(gè)現(xiàn)實(shí)問(wèn)題:
Spring Security引入了DelegatingPasswordEncoder,它通過(guò)以下方式解決了所有問(wèn)題:
您可以使用PasswordEncoderFactories輕松地構(gòu)造DelegatingPasswordEncoder的實(shí)例。
示例:創(chuàng)建默認(rèn)DelegatingPasswordEncoder
PasswordEncoder passwordEncoder =
PasswordEncoderFactories.createDelegatingPasswordEncoder();
或者,您可以創(chuàng)建自己的自定義實(shí)例。例如:
創(chuàng)建自定義DelegatingPasswordEncoder
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存儲(chǔ)格式
{id}encodedPassword
這樣,id是用于查找應(yīng)該使用哪個(gè)PasswordEncoder的標(biāo)識(shí)符,而encodedPassword是所選PasswordEncoder的原始編碼密碼。id必須在密碼的開(kāi)頭,以{開(kāi)始,以}結(jié)束。如果找不到id,則id為null。例如,下面可能是使用不同id編碼的密碼列表。所有的原始密碼都是“password”。
示例:DelegatingPasswordEncoder編碼密碼示例
{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
{noop}password
{pbkdf2}5d923b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4d6b99ca763d8dc
{scrypt}$e0801$8bWJaSu2IKSn9Z9kM+TPXfOc/9bdYSrN1oD9qfVThWEwdRTnO7re7Ei+fUZRJ68k9lTyuTeUp4of4g24hHnazw==$OAOec05+bXxvuu/1qZ6NUR+xQYvYv7BeL1QxwRpY5Pc=
{sha256}97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0
一些用戶(hù)可能會(huì)擔(dān)心存儲(chǔ)格式是為潛在的黑客提供的。這不是一個(gè)問(wèn)題,因?yàn)槊艽a的存儲(chǔ)并不依賴(lài)于算法是秘密的。此外,對(duì)于攻擊者來(lái)說(shuō),如果沒(méi)有前綴,大多數(shù)格式都很容易識(shí)別。例如,BCrypt密碼通常以a$開(kāi)頭。
密碼編碼
傳入構(gòu)造函數(shù)的idForEncode確定了將使用哪個(gè)PasswordEncoder對(duì)密碼進(jìn)行編碼。在我們上面構(gòu)造的DelegatingPasswordEncoder中,這意味著編碼密碼的結(jié)果將被委托給BCryptPasswordEncoder,并以{bcrypt}作為前綴。
最終結(jié)果如下:
DelegatingPasswordEncoder編碼的例子
{bcrypt}a$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
密碼匹配
匹配是基于{id}和id到構(gòu)造函數(shù)中提供的PasswordEncoder的映射來(lái)完成的。我們的密碼存儲(chǔ)格式示例提供了如何實(shí)現(xiàn)此功能的示例。默認(rèn)情況下,調(diào)用帶有密碼和沒(méi)有映射的id(包括null id)的匹配(CharSequence, String)的結(jié)果將導(dǎo)致IllegalArgumentException。可以使用DelegatingPasswordEncoder.setDefaultPasswordEncoderForMatches(PasswordEncoder)自定義此行為。
通過(guò)使用id,我們可以匹配任何密碼編碼,但是使用最現(xiàn)代的密碼編碼編碼密碼。這一點(diǎn)很重要,因?yàn)榕c加密不同,密碼哈希被設(shè)計(jì)成沒(méi)有簡(jiǎn)單的方法來(lái)恢復(fù)明文。由于沒(méi)有辦法恢復(fù)明文,這使得遷移密碼變得困難。雖然遷移NoOpPasswordEncoder對(duì)用戶(hù)來(lái)說(shuō)很簡(jiǎn)單,但我們選擇在默認(rèn)情況下包含它,以簡(jiǎn)化入門(mén)體驗(yàn)。
開(kāi)始體驗(yàn)
如果您正在制作一個(gè)演示或示例,那么花時(shí)間對(duì)用戶(hù)的密碼進(jìn)行哈希會(huì)有點(diǎn)麻煩。有一些方便的機(jī)制可以使這變得更容易,但這仍然不是用于生產(chǎn)的。
示例:withDefaultPasswordEncoder
User user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("user")
.build();
System.out.println(user.getPassword());
// {bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
如果要?jiǎng)?chuàng)建多個(gè)用戶(hù),還可以重用構(gòu)建器。
示例:withdefaultpasswordencoder重用構(gòu)建器
UserBuilder users = User.withDefaultPasswordEncoder();
User user = users
.username("user")
.password("password")
.roles("USER")
.build();
User admin = users
.username("admin")
.password("password")
.roles("USER","ADMIN")
.build();
這將哈希存儲(chǔ)的密碼,但密碼仍然暴露在內(nèi)存和已編譯的源代碼中。
因此,對(duì)于生產(chǎn)環(huán)境來(lái)說(shuō),它仍然不安全。對(duì)于生產(chǎn),您應(yīng)該在外部散列您的密碼。
用Spring Boot CLI編碼
正確編碼密碼的最簡(jiǎn)單方法是使用Spring Boot CLI(https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-cli.html)。
例如,下面的代碼將對(duì)password的密碼進(jìn)行編碼,以便與DelegatingPasswordEncoder一起使用:
Spring Boot CLI 編碼密碼使用實(shí)例
spring encodepassword password
{bcrypt}$2a$10$X5wFBtLrL/kHcmrOGGTrGufsBX8CJ0WpQpF3pgeuxBB/H73BK1DW6
故障排除
當(dāng)存儲(chǔ)的其中一個(gè)密碼不具有密碼存儲(chǔ)格式中描述的id時(shí),會(huì)發(fā)生以下錯(cuò)誤。
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
at org.springframework.security.crypto.password.DelegatingPasswordEncoder$UnmappedIdPasswordEncoder.matches(DelegatingPasswordEncoder.java:233)
at org.springframework.security.crypto.password.DelegatingPasswordEncoder.matches(DelegatingPasswordEncoder.java:196)
解決該錯(cuò)誤的最簡(jiǎn)單方法是切換到顯式提供編碼密碼的PasswordEncoder。解決這個(gè)問(wèn)題最簡(jiǎn)單的方法是找出你的密碼目前是如何被存儲(chǔ)的,并明確地提供正確的密碼編碼器。
如果您從Spring Security 4.2.x遷移。您可以通過(guò)公開(kāi)的NoOpPasswordEncoder bean恢復(fù)到以前的行為。
或者,您可以使用正確的id作為所有密碼的前綴,并繼續(xù)使用DelegatingPasswordEncoder。例如,如果你正在使用BCrypt,你會(huì)遷移你的密碼從一些類(lèi)似:
a$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
到
{bcrypt}a$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
有關(guān)映射的完整列表,請(qǐng)參考PasswordEncoderFactories上的Javadoc(https://docs.spring.io/spring-security/site/docs/5.0.x/api/org/springframework/security/crypto/factory/PasswordEncoderFactories.html)。
BCryptPasswordEncoder實(shí)現(xiàn)使用廣泛支持的bcrypt算法對(duì)密碼進(jìn)行哈希。為了使其更能抵抗密碼破解,bcrypt故意放慢速度。與其他自適應(yīng)單向函數(shù)一樣,應(yīng)該將其調(diào)整為在系統(tǒng)上花費(fèi)大約1秒的時(shí)間驗(yàn)證密碼。BCryptPasswordEncoder的默認(rèn)實(shí)現(xiàn)使用強(qiáng)度10。建議您在自己的系統(tǒng)上調(diào)優(yōu)和測(cè)試強(qiáng)度參數(shù),以便驗(yàn)證密碼大約需要1秒。
示例:BCryptPasswordEncoder
// Create an encoder with strength 16
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(16);
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result));
Argon2PasswordEncoder實(shí)現(xiàn)使用Argon2(https://en.wikipedia.org/wiki/Argon2)算法對(duì)密碼進(jìn)行哈希。Argon2是密碼哈希競(jìng)賽的獲勝者(https://en.wikipedia.org/wiki/Password_Hashing_Competition)。為了在自定義硬件上破解密碼,Argon2是一個(gè)需要大量?jī)?nèi)存的緩慢算法。與其他自適應(yīng)單向函數(shù)一樣,應(yīng)該將其調(diào)整為在系統(tǒng)上花費(fèi)大約1秒的時(shí)間驗(yàn)證密碼。Argon2PasswordEncoder的當(dāng)前實(shí)現(xiàn)需要BouncyCastle。
示例:Argon2PasswordEncoder
// Create an encoder with all the defaults
Argon2PasswordEncoder encoder = new Argon2PasswordEncoder();
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result));
Pbkdf2PasswordEncoder實(shí)現(xiàn)使用PBKDF2(https://en.wikipedia.org/wiki/PBKDF2)算法對(duì)密碼進(jìn)行哈希。阻止密碼破解的,PBKDF2是一種故意很慢的算法。與其他自適應(yīng)單向函數(shù)一樣,應(yīng)該將其調(diào)整為在系統(tǒng)上花費(fèi)大約1秒的時(shí)間驗(yàn)證密碼。當(dāng)需要FIPS認(rèn)證時(shí),這種算法是一個(gè)很好的選擇。
示例:Pbkdf2PasswordEncoder
// Create an encoder with all the defaults
Pbkdf2PasswordEncoder encoder = new Pbkdf2PasswordEncoder();
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result));
SCryptPasswordEncoder實(shí)現(xiàn)使用scrypt(https://en.wikipedia.org/wiki/Scrypt)算法對(duì)密碼進(jìn)行哈希。為了阻止在定制硬件scrypt上的密碼破解,這是一個(gè)故意慢的算法,需要大量的內(nèi)存。與其他自適應(yīng)單向函數(shù)一樣,應(yīng)該將其調(diào)整為在系統(tǒng)上花費(fèi)大約1秒的時(shí)間驗(yàn)證密碼。
示例:SCryptPasswordEncoder
// Create an encoder with all the defaults
SCryptPasswordEncoder encoder = new SCryptPasswordEncoder();
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result));
還有很多其他的PasswordEncoder實(shí)現(xiàn)完全是為了向后兼容而存在的。它們都已棄用,以表明它們不再被認(rèn)為是安全的。然而,由于很難遷移現(xiàn)有的遺留系統(tǒng),因此沒(méi)有刪除它們的計(jì)劃。
Spring Security默認(rèn)使用DelegatingPasswordEncoder。但是,這可以通過(guò)將PasswordEncoder公開(kāi)為Spring bean來(lái)進(jìn)行定制。
如果您從Spring Security 4.2.x遷移。您可以通過(guò)公開(kāi)NoOpPasswordEncoder bean恢復(fù)到以前的行為。
恢復(fù)到NoOpPasswordEncoder被認(rèn)為是不安全的。相反,您應(yīng)該遷移到使用DelegatingPasswordEncoder來(lái)支持安全的密碼編碼。
示例:NoOpPasswordEncoder
@Bean
public static NoOpPasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}
XML配置要求NoOpPasswordEncoder bean名稱(chēng)為passwordEncoder。
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。