shiro權限控制學習---編碼/解碼

散列算法

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

String str = "hello";  
String salt = "123";  
String md5 = new Md5Hash(str, salt).toString();

如上代碼通過鹽“123”MD5散列“hello”。另外散列時還可以指定散列次數(shù),如2次表示:md5(md5(str)):“new Md5Hash(str, salt, 2).toString()”。
常見的加密算法還有:SHA256、SHA1、SHA512算法。

Shiro還提供了通用的散列支持:

String str = "hello";  
String salt = "123";  
//內部使用MessageDigest  
String simpleHash = new SimpleHash("SHA-1", str, salt).toString(); 

為了方便使用,Shiro提供了HashService,默認提供了DefaultHashService實現(xiàn)。

 @Test
    public void testdemo() {
        DefaultHashService hashService = new DefaultHashService(); //默認算法SHA-512
        hashService.setHashAlgorithmName("SHA-512");
        hashService.setPrivateSalt(new SimpleByteSource("123")); //私鹽,默認無
        hashService.setGeneratePublicSalt(true);//是否生成公鹽,默認false
        hashService.setRandomNumberGenerator(new SecureRandomNumberGenerator());//用于生成公鹽。默認就這個
        hashService.setHashIterations(1); //生成Hash值的迭代次數(shù)

        HashRequest request = new HashRequest.Builder()
                .setAlgorithmName("MD5").setSource(ByteSource.Util.bytes("hello"))
                .setSalt(ByteSource.Util.bytes("123")).setIterations(2).build();
        String hex = hashService.computeHash(request).toHex();
    }

1、首先創(chuàng)建一個DefaultHashService,默認使用SHA-512算法;
2、可以通過hashAlgorithmName屬性修改算法;
3、可以通過privateSalt設置一個私鹽,其在散列時自動與用戶傳入的公鹽混合產生一個新鹽;
4、可以通過generatePublicSalt屬性在用戶沒有傳入公鹽的情況下是否生成公鹽;
5、可以設置randomNumberGenerator用于生成公鹽;
6、可以設置hashIterations屬性來修改默認加密迭代次數(shù);
7、需要構建一個HashRequest,傳入算法、數(shù)據(jù)、公鹽、迭代次數(shù)。

加密/解密

AES算法實現(xiàn):

    /**
     * 加密/解密
     */
    @Test
    public void testAesCipherService() {
        AesCipherService aesCipherService = new AesCipherService();
        aesCipherService.setKeySize(128);//設置key長度

        //生成key
        Key key = aesCipherService.generateNewKey();

        String text = "hello";

        //加密
        String encrptText = aesCipherService.encrypt(text.getBytes(), key.getEncoded()).toHex();
        //解密
        String text2 = new String(aesCipherService.decrypt(Hex.decode(encrptText), key.getEncoded()).getBytes());

        Assert.assertEquals(text, text2);

        System.out.println(text);
        System.out.println(encrptText);
        System.out.println(text2);
    }
運行結果
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 網絡安全(數(shù)據(jù)安全) 相關概念 安全的原則在網絡上不允許傳輸用戶隱私數(shù)據(jù)的明文在本地不允許保存用戶隱私數(shù)據(jù)的明文 ...
    彼岸的黑色曼陀羅閱讀 758評論 1 2
  • 這篇文章主要講述在Mobile BI(移動商務智能)開發(fā)過程中,在網絡通信、數(shù)據(jù)存儲、登錄驗證這幾個方面涉及的加密...
    雨_樹閱讀 3,043評論 0 6
  • //聯(lián)系人:石虎 QQ: 1224614774昵稱:嗡嘛呢叭咪哄 什么是UICollectionView UICo...
    石虎132閱讀 3,614評論 0 15
  • 今天帶學生參加在中國科技館的講故事比賽,有的小朋友發(fā)揮得很好,有的小朋友一時緊張忘了詞。每一次比賽,都是對自我認知...
    紅雲說口才閱讀 414評論 0 0
  • 有一個小女孩 在她生下來不久父母離婚 跟著她爸 從沒見過她媽 在十八歲快生日那年終于知道她媽的電話 忍不住打了個電...
    weture閱讀 433評論 0 0

友情鏈接更多精彩內容