Java中我們經(jīng)常會(huì)使用JSON(JavaScript Object Notation)格式進(jìn)行數(shù)據(jù)交互,而有時(shí)為了保護(hù)數(shù)據(jù)安全,我們會(huì)對(duì)JSON數(shù)據(jù)進(jìn)行加密,比如使用AES算法進(jìn)行加密。
但是,在加密過(guò)程中會(huì)出現(xiàn)亂碼的問(wèn)題。就算在加密之后將密文進(jìn)行Base64編碼,再轉(zhuǎn)換為JSON格式進(jìn)行傳輸,仍然會(huì)出現(xiàn)亂碼。
這是因?yàn)镴SON格式使用的是Unicode編碼,而加密算法是針對(duì)字節(jié)流進(jìn)行操作的,加密之后的數(shù)據(jù)無(wú)法直接轉(zhuǎn)換為Unicode編碼。
為了解決這個(gè)問(wèn)題,我們可以對(duì)加密后的字節(jié)數(shù)據(jù)進(jìn)行Base64編碼,然后再轉(zhuǎn)換為String類(lèi)型進(jìn)行傳輸。在接收端,我們需要將這個(gè)String類(lèi)型的密文進(jìn)行Base64解碼,再進(jìn)行解密操作,最后得到我們想要的JSON格式的數(shù)據(jù)。
//加密 String plainText = "{'name':'Tom','age':18}"; byte[] key = "1234567890abcdef".getBytes(); byte[] encrypted = AESUtils.encrypt(plainText.getBytes(), key); String base64Encrypted = Base64Utils.encodeToString(encrypted); //傳輸base64Encrypted //解密 byte[] base64Decrypted = Base64Utils.decodeFromString(base64Encrypted); byte[] decrypted = AESUtils.decrypt(base64Decrypted, key); String plainJson = new String(decrypted); JSONObject jsonObject = new JSONObject(plainJson);
在解密過(guò)程中,我們需要保證密鑰一致,否則解密會(huì)失敗。同時(shí)也需要注意解密之后得到的數(shù)據(jù)格式是否正確。
總之,對(duì)于需要加密傳輸?shù)腏SON數(shù)據(jù),我們需要注意亂碼問(wèn)題,使用Base64編碼來(lái)解決這個(gè)問(wèn)題。