<tbody id="fuft6"><noscript id="fuft6"><video id="fuft6"></video></noscript></tbody>
    <tbody id="fuft6"><noscript id="fuft6"></noscript></tbody>
    <em id="fuft6"><acronym id="fuft6"></acronym></em>
          <button id="fuft6"><acronym id="fuft6"><u id="fuft6"></u></acronym></button>
          首頁技術文章正文

          shiro支持的編碼/解碼和散列算法

          更新時間:2020-08-14 來源:黑馬程序員 瀏覽量:

          【1】編碼與解碼

          Shiro提供了base64和16進制字符串編碼/解碼的API支持,方便一些編碼解碼操作。

          Shiro內部的一些數據的【存儲/表示】都使用了base64和16進制字符串。

          【1.1】需求

          理解base64和16進制字符串編碼/解碼

          【1.2】新建項目

          新建shiro-day01-03encode-decode

          1597387876262_編碼散列算法01.jpg

          【1.3】新建EncodesUtil

          package com.itheima.shiro.tools;
          
          import org.apache.shiro.codec.Base64;
          import org.apache.shiro.codec.Hex;
          
          /**
           * @Description:封裝base64和16進制編碼解碼工具類
           */
          public class EncodesUtil {
          
              /**
               * @Description HEX-byte[]--String轉換
               * @param input 輸入數組
               * @return String
               */
              public static String encodeHex(byte[] input){
                  return Hex.encodeToString(input);
              }
          
              /**
               * @Description HEX-String--byte[]轉換
               * @param input 輸入字符串
               * @return byte數組
               */
              public static byte[] decodeHex(String input){
                  return Hex.decode(input);
              }
          
              /**
               * @Description Base64-byte[]--String轉換
               * @param input 輸入數組
               * @return String
               */
              public static String encodeBase64(byte[] input){
                  return Base64.encodeToString(input);
              }
          
              /**
               * @Description Base64-String--byte[]轉換
               * @param input 輸入字符串
               * @return byte數組
               */
              public static byte[] decodeBase64(String input){
                  return Base64.decode(input);
              }
          
          }


          【1.4】新建ClientTest

          package com.itheima.shiro.client;
          
          import com.itheima.shiro.tools.EncodesUtil;
          import org.junit.Test;
          
          /**
           * @Description:測試
           */
          public class ClientTest {
          
              /**
               * @Description 測試16進制編碼
               */
              @Test
              public void testHex(){
                  String val = "holle";
                  String flag = EncodesUtil.encodeHex(val.getBytes());
                  String valHandler = new String(EncodesUtil.decodeHex(flag));
                  System.out.println("比較結果:"+val.equals(valHandler));
              }
          
              /**
               * @Description 測試base64編碼
               */
              @Test
              public void testBase64(){
                  String val = "holle";
                  String flag = EncodesUtil.encodeBase64(val.getBytes());
                  String valHandler = new String(EncodesUtil.decodeBase64(flag));
                  System.out.println("比較結果:"+val.equals(valHandler));
              }
          
          
          }


          【1.5】小結

          1、shiro目前支持的編碼與解碼:

          ·base64

          ·(HEX)16進制字符串

          2、那么shiro的編碼與解碼什么時候使用呢?又是怎么使用的呢?

          【2】散列算法

          散列算法一般用于生成數據的摘要信息,是一種不可逆的算法,一般適合存儲密碼之類的數據,常見的散列算法如MD5、SHA等。一般進行散列時最好提供一個salt(鹽),比如加密密碼“admin”,產生的散列值是“21232f297a57a5a743894a0e4a801fc3”,可以到一些md5解密網站很容易的通過散列值得到密碼“admin”,即如果直接對密碼進行散列相對來說破解更容易,此時我們可以加一些只有系統知道的干擾數據,如salt(即鹽);這樣散列的對象是“密碼+salt”,這樣生成的散列值相對來說更難破解。

          shiro支持的散列算法:

          Md2Hash、Md5Hash、Sha1Hash、Sha256Hash、Sha384Hash、Sha512Hash

          1597387887175_編碼散列算法02.jpg

          【2.1】新增DigestsUtil

          package com.itheima.shiro.tools;
          
          import com.sun.org.apache.bcel.internal.generic.NEW;
          import org.apache.shiro.crypto.SecureRandomNumberGenerator;
          import org.apache.shiro.crypto.hash.SimpleHash;
          import sun.security.util.Password;
          
          import java.util.HashMap;
          import java.util.Map;
          
          /**
           * @Description:摘要
           */
          public class DigestsUtil {
          
              private static final String SHA1 = "SHA-1";
          
              private static final Integer ITERATIONS =512;
          
              /**
               * @Description sha1方法
               * @param input 需要散列字符串
               * @param salt 鹽字符串
               * @return
               */
              public static String sha1(String input, String salt) {
                 return new SimpleHash(SHA1, input, salt,ITERATIONS).toString();
              }
          
              /**
               * @Description 隨機獲得salt字符串
               * @return
               */
              public static String generateSalt(){
                  SecureRandomNumberGenerator randomNumberGenerator = new SecureRandomNumberGenerator();
                  return randomNumberGenerator.nextBytes().toHex();
              }
          
          
              /**
               * @Description 生成密碼字符密文和salt密文
               * @param
               * @return
               */
              public static Map<String,String> entryptPassword(String passwordPlain) {
                 Map<String,String> map = new HashMap<>();
                 String salt = generateSalt();
                 String password =sha1(passwordPlain,salt);
                 map.put("salt", salt);
                 map.put("password", password);
                 return map;
              }
          }


          【2.2】新增ClientTest

          package com.itheima.shiro.client;
          
          import com.itheima.shiro.tools.DigestsUtil;
          import com.itheima.shiro.tools.EncodesUtil;
          import org.junit.Test;
          
          import java.util.Map;
          
          /**
           * @Description:測試
           */
          public class ClientTest {
          
              /**
               * @Description 測試16進制編碼
               */
              @Test
              public void testHex(){
                  String val = "holle";
                  String flag = EncodesUtil.encodeHex(val.getBytes());
                  String valHandler = new String(EncodesUtil.decodeHex(flag));
                  System.out.println("比較結果:"+val.equals(valHandler));
              }
          
              /**
               * @Description 測試base64編碼
               */
              @Test
              public void testBase64(){
                  String val = "holle";
                  String flag = EncodesUtil.encodeBase64(val.getBytes());
                  String valHandler = new String(EncodesUtil.decodeBase64(flag));
                  System.out.println("比較結果:"+val.equals(valHandler));
              }
          
              @Test
              public void testDigestsUtil(){
                 Map<String,String> map =  DigestsUtil.entryptPassword("123");
                  System.out.println("獲得結果:"+map.toString());
              }
          
          }


          猜你喜歡:

          Shiro特點和運行原理詳細介紹

          shiro是啥?Shiro的核心組件介紹

          Shiro入門教程:如何實現身份認證?

          Shiro如何實現Realm接口?

          Java高級軟件工程師培訓課程

          在線咨詢 我要報名
          和我們在線交談!

          黄色网站片

          <tbody id="fuft6"><noscript id="fuft6"><video id="fuft6"></video></noscript></tbody>
            <tbody id="fuft6"><noscript id="fuft6"></noscript></tbody>
            <em id="fuft6"><acronym id="fuft6"></acronym></em>
                  <button id="fuft6"><acronym id="fuft6"><u id="fuft6"></u></acronym></button>