中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
191120_02 Java常用加密校驗(yàn)轉(zhuǎn)換算法匯總

Java常用加密校驗(yàn)轉(zhuǎn)換算法匯總

作者:邵發(fā)

官網(wǎng):http://afanihao.cn/java

本文是Java學(xué)習(xí)指南系列教程的官方配套文檔。內(nèi)容介紹Java里的常用算法的使用,包含轉(zhuǎn)換Hex / Base64等數(shù)據(jù)轉(zhuǎn)換算法,CRC32 / MD5 / HMAC-SHA1數(shù)據(jù)簽名和校驗(yàn)算法,DES / AES等對(duì)稱(chēng)加密算法。

由于篇幅的限制,本文只對(duì)各種算法的使用給出代碼示例。如果對(duì)原理有不明白的地方,可以參考Java學(xué)習(xí)指南系列的《項(xiàng)目應(yīng)用篇》,里面對(duì)每一個(gè)算法的應(yīng)用背景和原理有較為詳細(xì)的解釋。本文附帶項(xiàng)目源碼及相關(guān)JAR包。

1. Hex轉(zhuǎn)換

Java里,一般性的數(shù)據(jù)用byte[]表示,即字節(jié)數(shù)組。由于byte[]本身不可顯示,所以為了顯示和傳遞的方便,有時(shí)候需要把它轉(zhuǎn)化為十六進(jìn)制顯示。

1.1 byte[] => Hex String

例如,

byte[] code   ={ -5, 0, 10, 99, 20 };

String hex =Hex.encodeHexString(code, false);

code表示5個(gè)字節(jié)的數(shù)據(jù),將其轉(zhuǎn)成十六進(jìn)制表字符串為:FB000A6314 。在十六進(jìn)制表示下,每?jī)蓚€(gè)字符表示1字節(jié)的數(shù)據(jù),即FB 00 0A 64 14共五個(gè)字節(jié)。

1.2 Hex String => byte[]

反轉(zhuǎn)來(lái),也可以

byte[] code2  =Hex.decodeHex(hex);

解碼后得到長(zhǎng)度為5字節(jié)的數(shù)組code2,和原始數(shù)據(jù)內(nèi)容是一樣的。

Hex是一種數(shù)據(jù)轉(zhuǎn)換算法,它沒(méi)有改變數(shù)據(jù)的值,僅僅是換了一個(gè)表示方式。就好比機(jī)器貓和多萊夢(mèng),說(shuō)的是同一個(gè)事物。

2. Base64轉(zhuǎn)換

Base64,即64進(jìn)制的轉(zhuǎn)換。在64進(jìn)制下,一共有64個(gè)基礎(chǔ)字符。即,

'A', 'B', 'C', …, 'Y', 'Z',

'a', 'b', 'c', …, 'y', 'z',

'0', '1', '2', …, '8', '9',

'+', '-'

2.1 byte[] => Base64 String

以下示例,把4字節(jié)的數(shù)據(jù)轉(zhuǎn)成Base64的表示,例如。

              byte[]code   = { 12, 4 , 9, -2};

              Stringstr = Base64.encodeBase64String(code);

轉(zhuǎn)換的結(jié)果為: DAQJ/g==  ,雖然結(jié)果看起來(lái)有點(diǎn)奇怪,但這只是一個(gè)表示方式,數(shù)據(jù)的內(nèi)容沒(méi)有發(fā)生變化。

2.2 Base64 String => byte[]

反過(guò)來(lái),也可以把Base64表示的字符串,再解碼為字節(jié)數(shù)據(jù)。例如。

byte[]code2  = Base64.decodeBase64(str);

解碼之后,得到的字節(jié)數(shù)組和原始內(nèi)容是一致的。

3. MD5校驗(yàn)

業(yè)界用于校驗(yàn)的算法有多種,比如:

Parity : 奇偶校驗(yàn)

ECC : 錯(cuò)誤校驗(yàn)與糾正

Checksum : 和校驗(yàn)

CRC32 : 循環(huán)冗余校驗(yàn)

MD5 : 消息摘要

SHA1 : 安全哈希

其中,MD5SHA1Java項(xiàng)目里使用比較多的校驗(yàn)算法。

所謂校驗(yàn)算法,用于在傳輸過(guò)程中的完整性的校驗(yàn)。比如,AB發(fā)送一個(gè)大文件,B在接收到之后惴惴不安,因?yàn)樗荒艽_定這么大一個(gè)文件在傳輸過(guò)程中沒(méi)有錯(cuò)誤發(fā)生(比如某個(gè)字節(jié)傳錯(cuò)了)。B怎么才能夠確認(rèn)這個(gè)文件的完整性呢?需采用校驗(yàn)算法。

MD5的基本使用公式: Code = MD5 ( Data)

其中 Data為輸入的一段數(shù)據(jù),經(jīng)過(guò)MD5運(yùn)算之后,得到16字節(jié)的結(jié)果,稱(chēng)為MD5碼。

特點(diǎn):

1 無(wú)論Data有多長(zhǎng),輸出的MD5碼總是16字節(jié)

2 如果Data不同,則輸出的MD5碼也不相同。(極大概率不同)

3.1 示例:求MD5校驗(yàn)碼

              //待處理的數(shù)據(jù),任意長(zhǎng)度

              byte[]data = { 12, 8, 9, -1, 87, 0, -47, 99, 14, 54 };

              //創(chuàng)建算法實(shí)例 ,MD5 SHA1

              MessageDigestmd = MessageDigest.getInstance("MD5");

              md.update(data);

              byte[]code = md.digest();

              //轉(zhuǎn)成HEX顯示 (參考上一章)

              Stringresult = Hex.encodeHexString(code, false);

需要注意的是,MD5算法的輸出結(jié)果是一個(gè)長(zhǎng)為16字節(jié)的byte[],通常需要轉(zhuǎn)成十六進(jìn)制的字符串顯示。所以我們通??吹降?/span>MD5值是由32字符表示的。

3.2 對(duì)字符串求MD5

Java項(xiàng)目中,通常需要對(duì)字符串求MD5碼。示例如下。

// 待處理的字符串

              Stringtext = "阿發(fā)你好/afanihao.cn";

              //轉(zhuǎn)成字節(jié)數(shù)據(jù)

              byte[]data = text.getBytes("UTF-8");

              //求消息摘要

              MessageDigestmd = MessageDigest.getInstance("MD5");

              md.update(data);

              byte[]code = md.digest();

              //轉(zhuǎn)成HEX顯示

              Stringresult = Hex.encodeHexString(code, false);

              System.out.println("校驗(yàn)碼: " + result);

使用MD5算法,也可以對(duì)一個(gè)很大的文件求MD5碼。示例代碼略。

4. SHA1校驗(yàn)

SHA1也是一種校驗(yàn)算法,比MD5更強(qiáng),輸出20字節(jié)的校驗(yàn)碼。它的使用方法和MD5一樣,只需要把算法的名字改成SHA1就行了。

              byte[]data = { 12, 8, 9, -1, 87, 0, -47, 99, 14, 54 };

              MessageDigestmd = MessageDigest.getInstance("SHA1");

              md.update(data);

              byte[]code = md.digest();

              Stringresult = Hex.encodeHexString(code, false);

5. CRC32校驗(yàn)

CRC32也是一種校驗(yàn)算法,生成4字節(jié)的校驗(yàn)碼。它在Java領(lǐng)域使用得不多,稍微了解一下即可。

5.1  示例:根據(jù)byte[]生成CRC32校驗(yàn)碼

              //待處理的數(shù)據(jù),任意長(zhǎng)度

              byte[]data = { 12, 8, 9, -1, 87, 0, -47, 99, 14, 54 };          

              //創(chuàng)建算法實(shí)例

              CRC32crc = new CRC32();

              crc.update(data );

              longvalue = crc.getValue();

              //轉(zhuǎn)成HEX顯示 (參考上一章)

              Stringresult = Long.toHexString(value);

              System.out.println("校驗(yàn)碼: " + result);

6. HMAC-SHA1簽名

所謂簽名,也是一種校驗(yàn)算法,只是這個(gè)校驗(yàn)碼是無(wú)法偽造的。簽名算法用于保證數(shù)據(jù)的真實(shí)現(xiàn)性。

例如,

       Code = HMAC-SHA1( Data, Key )

其中,Data為輸入的數(shù)據(jù),Key為指定的密鑰。在經(jīng)過(guò)HMAC-SHA1運(yùn)算后,得到一個(gè)20字節(jié)的校驗(yàn)碼。

這個(gè)校驗(yàn)碼是無(wú)法偽造的,只有持有Key的人,才能生成相同的校驗(yàn)碼。在傳遞的過(guò)程,傳輸雙方都知曉這個(gè)密鑰,才能得到相同的校驗(yàn)碼。

6.1 示例:HMAC-SHA1簽名

// 數(shù)據(jù)

              byte[]data = { 12, 8, 9, -1, 87, 0, -47, 99, 14, 54 };

              //密鑰

              Stringkey = "test2019";

              //HMAC-SHA1 算法

              KeykeySpec = new SecretKeySpec(key.getBytes(), "HMACSHA1");

              Macmac = Mac.getInstance("HMACSHA1");

              mac.init(keySpec);

              //更新數(shù)據(jù)

              mac.update(data);

              //取得最終結(jié)果

              byte[]code = mac.doFinal();

              Stringresult = Hex.encodeHexString(code, false);

              System.out.println("簽名: " + result);

6.2  HmacSha1Util 工具類(lèi)

Java項(xiàng)目里,常見(jiàn)對(duì)String的簽名操作,為此封裝出一個(gè)工具類(lèi)HmacSha1Util。示例用法如下:

String text = "afanihao.cn | 阿發(fā)你好 | Java學(xué)習(xí)指南";

String key = "your_key_2019";

String result = HmacSha1Util(text , key);

7. DES加密

下面介紹兩種常見(jiàn)的加密算法:DESAES。其中,DES出現(xiàn)的較早,而AES是它的升級(jí)替代品。

什么叫加密?加密意味著秘密,只有持有秘鑰者可以解讀。

(1) 加密后的數(shù)據(jù)可以解密,還原為原始數(shù)據(jù)

(2) 只有持有秘鑰者可以解密

加密算法的一般公式為:

       Cipher= Encrypt( Plain, Key )

其中,Plain為原文,Key為密鑰。經(jīng)加密算法運(yùn)算后,得到密鑰。

反過(guò)來(lái),還可以解密,公式為:

       Plain= Decrypt ( Cipher, Key)

這個(gè)加密和加密的過(guò)程是對(duì)稱(chēng)的(互逆的),來(lái)回使用的是同一處密鑰,所以稱(chēng)為對(duì)稱(chēng)加密算法。

7.1  示例:DES加密

       public staticbyte[] encrypt(byte[] plain, byte[] key) throws Exception

       {         

              //使用 PKCS5補(bǔ)齊方式

          Cipher c = Cipher.getInstance("DES/ECB/PKCS5Padding");  

          SecretKeySpec keySpec = new SecretKeySpec(key, "DES");

          c.init(Cipher.ENCRYPT_MODE, keySpec);

          // 加密

          byte [] output = c.doFinal(plain);

          return output;

       }

其中,plain為原文,key是密角,返回值為密文。

Java項(xiàng)目中,密鑰通常為String,需要自己轉(zhuǎn)成byte[]。對(duì)于DES來(lái)說(shuō),要求密鑰長(zhǎng)度為8個(gè)字節(jié)。

7.2  示例:DES解密

       public staticbyte[] decrypt(byte[] cipher, byte[] key) throws Exception

       {         

              //使用 PKCS5補(bǔ)齊方式

          Cipher c = Cipher.getInstance("DES/ECB/PKCS5Padding");        

          SecretKeySpec keySpec = new SecretKeySpec(key, "DES");

          c.init(Cipher.DECRYPT_MODE, keySpec);

          byte [] output = c.doFinal(cipher);   

          return output;

       }

同樣地,在實(shí)際項(xiàng)目中處理的往往是String,而結(jié)果也往往要轉(zhuǎn)成HEX形式表示。所以要自己添加額外的處理,自己要稍微封裝一下再使用。

8. AES加密

AES是用于取代DES的更高級(jí)更強(qiáng)的加密算法,但用法基本是類(lèi)同的。AES加密密鑰長(zhǎng)度為16字節(jié),每16字節(jié)一組進(jìn)行加密。

8.1  示例:AES加密

       public staticbyte[] encrypt(byte[] plain, byte[] key) throws Exception

       {

              //AES

              Cipherc = Cipher.getInstance("AES/ECB/PKCS5Padding");

              SecretKeySpeckeySpec = new SecretKeySpec(key, "AES");

              c.init(Cipher.ENCRYPT_MODE,keySpec);

              //加密

              byte[]output = c.doFinal(plain);

              returnoutput;

       }

8.2 示例:AES解密

       public staticbyte[] decrypt(byte[] cipher, byte[] key) throws Exception

       {

              //AES

              Cipherc = Cipher.getInstance("AES/ECB/PKCS5Padding");

              SecretKeySpeckeySpec = new SecretKeySpec(key, "AES");

              c.init(Cipher.DECRYPT_MODE,keySpec);

              byte[]output = c.doFinal(cipher);

              returnoutput;

       }

其中,在準(zhǔn)備密鑰的時(shí)候,需保證密鑰長(zhǎng)度不少于16字節(jié)。

8.3 AESUtil工具類(lèi)

由于在Java項(xiàng)目中要處理的信息一般是String,所以對(duì)上述AES算法做一個(gè)簡(jiǎn)單的封裝,得到AESUtil工具類(lèi)。

示例用法如下:

              Stringkey = "your_key_2910";

              Stringplain = "阿發(fā)你好 |afanihao.cn | Java學(xué)習(xí)指南系列教程 ";             

              Stringcipher = AESUtil.encrypt(plain, key); // 加密

              Stringplain2 = AESUtil.decrypt(cipher, key); // 解密

這樣在項(xiàng)目中調(diào)用就非常的簡(jiǎn)單了,只需要自己指定一下密鑰,就可以進(jìn)行加密解密了。

以上介紹了幾種常見(jiàn)算法的使用,如果有對(duì)應(yīng)用背景、原理和項(xiàng)目使用不太清楚的地方,可以參考Java學(xué)習(xí)指南系列教程的《項(xiàng)目應(yīng)用篇》。 本篇演示所用的項(xiàng)目源碼和JAR包在此處可以獲取。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Java中常用的加密方法(JDK)
Java各種加密方式集錦(AES,DES,RSA,DSA,MD5,SHA)
關(guān)于加解密、加簽驗(yàn)簽的那些事
淺談常見(jiàn)的七種加密算法及實(shí)現(xiàn)
(原創(chuàng))System.Security.Cryptography中定義的加密算法
Android傳輸數(shù)據(jù)時(shí)加密詳解
更多類(lèi)似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服