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 成年男女的免费视频网站,欧美中文字幕一区二区三区,日本一级特黄特色大片大全

          整合營(yíng)銷(xiāo)服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢(xún)熱線(xiàn):

          Springboot,Mybatis修改登錄用戶(hù)的密碼

          、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)行比較的密碼。

          密碼存儲(chǔ)歷史

          經(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ì)損失任何安全性。

          DelegatingPasswordEncoder

          在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)題:

          1. 有許多應(yīng)用程序使用不能輕易遷移的舊密碼編碼
          2. 密碼存儲(chǔ)的最佳實(shí)踐將再次更改。
          3. 作為一個(gè)框架,Spring Security不能頻繁地進(jìn)行破壞性更改

          Spring Security引入了DelegatingPasswordEncoder,它通過(guò)以下方式解決了所有問(wèn)題:

          • 確保密碼使用當(dāng)前密碼存儲(chǔ)建議進(jìn)行編碼
          • 允許以現(xiàn)代和傳統(tǒng)格式驗(yàn)證密碼
          • 允許在未來(lái)升級(jí)編碼

          您可以使用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);

          密碼存儲(chǔ)格式

          密碼的一般格式為:

          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
          1. 第一個(gè)密碼的密碼編碼id為bcrypt,編碼密碼為a$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG。匹配時(shí),它將委托給BCryptPasswordEncode
          2. 第二個(gè)密碼將有一個(gè)PasswordEncoder id為noop和一個(gè)編碼密碼為password。匹配時(shí),它將委托給NoOpPasswordEncoder
          3. 第三個(gè)密碼的密碼編碼器id為pbkdf2,編碼密碼為5d923b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4d6b99ca763d8dc。匹配時(shí),它將委托給Pbkdf2PasswordEncoder
          4. 第四個(gè)密碼的密碼編碼id為scrypt,編碼密碼為$e0801bWJaSu2IKSn9Z9kM+TPXfOc/9bdYSrN1oD9qfVThWEwdRTnO7re7Ei+fUZRJ68k9lTyuTeUp4of4g24hHnazw==$OAOec05+bXxvuu/1qZ6NUR+xQYvYv7BeL1QxwRpY5Pc=。匹配時(shí),它將委托給SCryptPasswordEncoder
          5. 最終密碼的密碼編碼id為sha256,編碼密碼為97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfff8410849f27605abcbc0。匹配時(shí),它將委托給StandardPasswordEncoder

          一些用戶(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

          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

          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

          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

          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));

          其他PasswordEncoders

          還有很多其他的PasswordEncoder實(shí)現(xiàn)完全是為了向后兼容而存在的。它們都已棄用,以表明它們不再被認(rèn)為是安全的。然而,由于很難遷移現(xiàn)有的遺留系統(tǒng),因此沒(méi)有刪除它們的計(jì)劃。

          密碼存儲(chǔ)配置

          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。


          主站蜘蛛池模板: 日韩精品一区二区三区中文精品 | 精品无码一区二区三区水蜜桃| 国产AV一区二区三区传媒| 国产日韩高清一区二区三区| 国产免费一区二区三区免费视频 | 无码人妻一区二区三区精品视频| 三上悠亚日韩精品一区在线| 国产一区二区视频在线观看| 久久久精品人妻一区二区三区蜜桃| 亚洲熟妇AV一区二区三区宅男 | 精品人妻少妇一区二区| 黑人大战亚洲人精品一区| 日韩在线一区二区| 偷拍精品视频一区二区三区| 精品亚洲综合在线第一区| 国产高清在线精品一区| 天天爽夜夜爽人人爽一区二区| 另类免费视频一区二区在线观看| 中文字幕日韩欧美一区二区三区 | 日韩一区二区在线观看视频| 国产福利日本一区二区三区| av无码一区二区三区| 亚洲一区二区三区免费在线观看| 国产一区二区三区在线观看影院| 精品一区二区三区四区| 国产欧美色一区二区三区| 2014AV天堂无码一区| 色婷婷亚洲一区二区三区| 伊人久久大香线蕉av一区| 国产精品一区二区无线| 无码国产精品一区二区免费式芒果| 国产乱码精品一区二区三区香蕉| 国产免费一区二区三区不卡| 国产小仙女视频一区二区三区| 伊人久久精品无码av一区| 在线不卡一区二区三区日韩| 久久伊人精品一区二区三区 | 亚洲一区动漫卡通在线播放| 国产伦一区二区三区高清| 鲁丝丝国产一区二区| 色窝窝无码一区二区三区|