真是圖樣圖樣森破呀,接上篇:《uni-app app vue 小程序 RSA 加密/解密 使用 jsencrypt 踩坑(Message too long for RSA/Cannot read property 'appName')(一)》,
本以為后端RSA加密,前端進行解密這個風波是過去了,結果今天又發現了異常:
這是一段長數據解密后的json。
然而在格式化的時候,發現該json字符串里居然有亂碼,導致格式不正確了,那就更別提轉化為json對象了。
…………
…………
反正折騰了很久,發現每次遇到很長的數據密文,解密后就會有這種情況。也真是難為RSA算法了,居然要幫我算這么長的解密。
快下班了,直接上解決方案吧:
第一步:后端Java進行分段加密。舉個栗子:
【以前的加密方式】:
1 String content = "1234567890"; 2 3 byte[] data = content.getBytes(); 4 byte[] encodedData = RSAUtil.encrypt(data, publicKey); 5 6 String encryptedContent = Base64Util.encode(encodedData);
這種是將所有json字符串加密為一個字符串。密文有的時候很長很長,幾十甚至上百KB。
【優化后的加密方式】:
1 String content = "1234567890"; 2 3 List<String> encryptedList = new ArrayList<>(); 4 5 //每X個字符,加密一次 6 if (content != null) { 7 int startIndex = 0; 8 int endIndex = 0; 9 int subLength = 50; 10 11 while (true) { 12 endIndex = startIndex + subLength; 13 14 if (content.length() <= endIndex) { 15 endIndex = startIndex + (content.length() - startIndex); 16 } 17 18 19 //region 將截取到的字符串,進行加密 20 byte[] data = content.substring(startIndex, endIndex).getBytes(); 21 byte[] encodedData = RSAUtil.encrypt(data, publicKey); 22 String encryptedStr = Base64Util.encode(encodedData); 23 24 encryptedList.add(encryptedStr); 25 //endregion 26 27 28 startIndex += subLength; 29 30 if (startIndex >= content.length()) { 31 break; 32 } 33 } 34 }
這樣返回的就是一個string數組到前台,格式如:{ data: ["密文片段1", "密文片段2", "密文片段3"] }
第二步:前端解密&拼接:
1 const decryptor = new JSEncrypt(); 2 const privateKey = "privateKey"; 3 decryptor.setPrivateKey(privateKey); 4 5 let jsonStr = ""; 6 if (encryptedList && encryptedList.length > 0) { 7 for (let encrypted of encryptedList) { 8 jsonStr += decryptor.decryptLong(encrypted); 9 } 10 }
這樣將每個密文片段,解密后,再按順序拼接起來,即可得到加密前的原始json字符串。隨后直接轉化為json對象即可:
搞定,收工,回家吃飯!
如果對您有幫助,方便的話請點個贊吧,謝謝~
密文片段1