首頁技術(shù)文章正文

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

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

【1】編碼與解碼

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

Shiro內(nèi)部的一些數(shù)據(jù)的【存儲/表示】都使用了base64和16進(jìn)制字符串。

【1.1】需求

理解base64和16進(jìn)制字符串編碼/解碼

【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進(jìn)制編碼解碼工具類
 */
public class EncodesUtil {

    /**
     * @Description HEX-byte[]--String轉(zhuǎn)換
     * @param input 輸入數(shù)組
     * @return String
     */
    public static String encodeHex(byte[] input){
        return Hex.encodeToString(input);
    }

    /**
     * @Description HEX-String--byte[]轉(zhuǎn)換
     * @param input 輸入字符串
     * @return byte數(shù)組
     */
    public static byte[] decodeHex(String input){
        return Hex.decode(input);
    }

    /**
     * @Description Base64-byte[]--String轉(zhuǎn)換
     * @param input 輸入數(shù)組
     * @return String
     */
    public static String encodeBase64(byte[] input){
        return Base64.encodeToString(input);
    }

    /**
     * @Description Base64-String--byte[]轉(zhuǎn)換
     * @param input 輸入字符串
     * @return byte數(shù)組
     */
    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進(jìn)制編碼
     */
    @Test
    public void testHex(){
        String val = "holle";
        String flag = EncodesUtil.encodeHex(val.getBytes());
        String valHandler = new String(EncodesUtil.decodeHex(flag));
        System.out.println("比較結(jié)果:"+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("比較結(jié)果:"+val.equals(valHandler));
    }


}


【1.5】小結(jié)

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

·base64

·(HEX)16進(jìn)制字符串

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

【2】散列算法

散列算法一般用于生成數(shù)據(jù)的摘要信息,是一種不可逆的算法,一般適合存儲密碼之類的數(shù)據(jù),常見的散列算法如MD5、SHA等。一般進(jìn)行散列時最好提供一個salt(鹽),比如加密密碼“admin”,產(chǎn)生的散列值是“21232f297a57a5a743894a0e4a801fc3”,可以到一些md5解密網(wǎng)站很容易的通過散列值得到密碼“admin”,即如果直接對密碼進(jìn)行散列相對來說破解更容易,此時我們可以加一些只有系統(tǒng)知道的干擾數(shù)據(jù),如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 隨機(jī)獲得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進(jìn)制編碼
     */
    @Test
    public void testHex(){
        String val = "holle";
        String flag = EncodesUtil.encodeHex(val.getBytes());
        String valHandler = new String(EncodesUtil.decodeHex(flag));
        System.out.println("比較結(jié)果:"+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("比較結(jié)果:"+val.equals(valHandler));
    }

    @Test
    public void testDigestsUtil(){
       Map<String,String> map =  DigestsUtil.entryptPassword("123");
        System.out.println("獲得結(jié)果:"+map.toString());
    }

}


猜你喜歡:

Shiro特點和運行原理詳細(xì)介紹

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

Shiro入門教程:如何實現(xiàn)身份認(rèn)證?

Shiro如何實現(xiàn)Realm接口?

Java高級軟件工程師培訓(xùn)課程

分享到:
在線咨詢 我要報名
和我們在線交談!