日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java1.7版本解码base64_JDK Base64 编解码 1.7 和 1.8 的坑

發布時間:2024/3/7 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java1.7版本解码base64_JDK Base64 编解码 1.7 和 1.8 的坑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JDK Base64 編解碼 1.7 和 1.8 的坑

場景

對接一個第三方 API 接口, 其中簽名部分用的是 JDK8 的編碼. 我們線上采用 JDK7, 導致項目無法編譯

替換編解碼部分為 1.7 的代碼, 然后簽名又不對

所以坑就在這里, 結論, 1.7 的編解碼有換行符導致簽名失敗

貼代碼importsun.misc.BASE64Decoder;

importjava.security.KeyFactory;

importjava.security.PrivateKey;

importjava.security.Signature;

importjava.security.spec.PKCS8EncodedKeySpec;

importjava.util.Base64;

publicclassBase64EncodeDemo{

publicstaticfinalStringCHARSET_UTF_8="UTF-8";

publicstaticfinalStringALGORITHM_RSA="RSA";

publicstaticfinalStringALGORITHM_SHA1_WITH_RSA="SHA1withRSA";

privatestaticStringsignWithRSAJdk7(Stringsource,StringprivateKey,Stringalgorithm){

Stringresult=null;

try{

// 修改為 1.7 語法

// PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey));

PKCS8EncodedKeySpec spec=newPKCS8EncodedKeySpec(newBASE64Decoder().decodeBuffer(privateKey));

KeyFactorykeyFactory=KeyFactory.getInstance(ALGORITHM_RSA);

PrivateKeypk=keyFactory.generatePrivate(spec);

Signaturesignature=Signature.getInstance(algorithm);

signature.initSign(pk);

signature.update(source.getBytes(CHARSET_UTF_8));

// 修改為 1.7 語法

//result = Base64.getEncoder().encodeToString(signature.sign());

result=newsun.misc.BASE64Encoder().encode(signature.sign());

System.out.println("jdk7 解碼簽名換行符去掉前:"+result);

// 1.7 語法需要去掉換行符 這里是重點

result=result.replaceAll("\\n","");

System.out.println("jdk7 解碼簽名換行符去掉后:"+result);

}catch(Exceptione){

System.out.println("RSA 簽名出錯!");

e.printStackTrace();

}

returnresult;

}

privatestaticStringsignWithRSAJdk8(Stringsource,StringprivateKey,Stringalgorithm){

Stringresult=null;

try{

PKCS8EncodedKeySpec spec=newPKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey));

KeyFactorykeyFactory=KeyFactory.getInstance(ALGORITHM_RSA);

PrivateKeypk=keyFactory.generatePrivate(spec);

Signaturesignature=Signature.getInstance(algorithm);

signature.initSign(pk);

signature.update(source.getBytes(CHARSET_UTF_8));

result=Base64.getEncoder().encodeToString(signature.sign());

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

}catch(Exceptione){

System.out.println("RSA 簽名出錯!");

e.printStackTrace();

}

returnresult;

}

publicstaticvoidmain(String[]args)throwsException{

Stringsource="app_id=89be0bb80a7a4e219b4011168c478f0c&biz_content={\"user_id\":\"17681865480\",\"idcard\":\"09612707419874225X\",\"name\":\" 張三 \",\"mobile\":\"17681865480\"}&format=JSON&method=moxie.api.risk.magicwand3.enhance-multi-info&sign_type=RSA*tamp=1567593061041&version=1.0";

Stringprivatekey="MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDjAKaU7DbXOMoa63pF1ArcyMPWmMxmmfpBlewFHDnqFee5Gm3XdLR+fvGj+ZwddEx27ZJkkjVoXmk1/NqT+9nFXvXSctfHu6OsmYaWguCCHDjMLzuWKhuTtFohFUJQLIyfuVImzGKPv1WMoPsjouz1trTXHwpF5oj0mqI1B0HZDBsb55Dyl3DkfIaZBkr7s0tuJ/LBIhengMp2gBc9d61Qr1S6mSAv1Hj6IrL34gkZv0U0+bdDO227/r14KS4MTaHudYM7fb43f0+VEcBXUKnQgR+f6yCq67JJyPaPQYtvrf+J6azrr1+hlX6FFGWNYwaKRblgg+b5ICw5hrR2H97LAgMBAAECggEAPH565isA/mAC9COWxS8Z6faSwgicSCd2mq3SZRY9lNVbmGejqAxQ4XkA+lrVsL/CdNsg7S5Nj0/BqAKHWXJ/eWqyBfBW8sJdfuy3AjtEi0fsFvXrYjw8dyNT9YcN0gHdQ9+GNhK3nWk26jAoXTnY/i4/iSibez9RdiYTXiBd+vIPXC/KpjyN8GXiDNg2Zc9aSK6M7Bqvy5w7QDyl+YHw55DIAjdXYkGR645xO3rhMaLcQ1SiUN0lvjKqGaHIjSYBPRjPuk4GFz6Ews0d+xdl3cMNodVosx3yNjKLTSYbJlwIYrcSMlBDjN3h6ZwY4znrehNuWAjhUvn0SI2NUupRAQKBgQD7BLyJXWsItGZPFTa8KBlg1GHphzmFXO6izZNb7CQPEklyDYKsrU2ZgMWtNJ2vDJ2d8PyzO5qILp8WUFOKgQTK7NJNemH1c2dcRVINRgiK5wN7xwp4mpm396X8flbArYYkHFXzFrt62DeJtvOWDgnUTETA/fvs2HdbUuQgLYBzSwKBgQDngeeTkKumR4NAFD7pC6galxB1vlzl3cAYQyCPE/DNo9INX+TmFPH1/JrSwSPUqC6KBTIJ2zkUpJm1XpGb4QZnlx4xNWwpjE+1fpjjer1a60t9V7Jur2DOiR83kzhE7NJ2ymnVv94v9wje1yhDnMyHY9KOppWeSIoam6XSB8+SgQKBgHHJd92c50QO4sG+kA1C8B4gqDHABqcZtWM/ZSkqJj5ev8Rfs3irJp4K7ZDSZRhQ07Ig56wnvKk22Q64YuZKDe4e5EYS0Az/vz7ofYVe1ciBZ+bYFzsMedoW/Ls0WgcFoeUEo0GKcHoDQUnAETNYMcR2vkPt3iFDDvfq31Zmye95AoGBALoQ1U/ryZnGBj49R2bEoKJmYatQiZeSR274nLWCIFsW3J81QGKP2PyMvt6+ro6fcXAqxtHXKSRnOsbjsAHptN0TPwfr2Pf3tqS3kCfcoU3uqOif0GBXgmXdHYLsRyBWer1Q6AkMwYYpdS6tHMZiwpvaZgOS7dOel6jVCkwpTPKBAoGBALu3R6ABaZx8c4C56ucL79akf1iw7s/3tpS3h3FJ5NzNeovtkmCuHosFWQkA4VKXQvL0S1zwWVd9/YJot5q05o5xn13yDhhmXqd8Da+ZMQJH0PMMyVlKF9tj7o6G5ZhFCTqZdVDdKE05De89d9ybNH3dGWU4ZycfbRa3pHmRuaHO";

Stringsign7=signWithRSAJdk7(source,privatekey,ALGORITHM_SHA1_WITH_RSA);

Stringsign8=signWithRSAJdk8(source,privatekey,ALGORITHM_SHA1_WITH_RSA);

// System.out.println(msg);

System.out.println("--------------");

System.out.println(sign7.equals(sign8));

}

}

運行結果:

jdk7 解碼簽名換行符去掉前: QXEvl/xDLanJ6GfB+eeZbawiKZwF3m1HzUr6r0GIk7DtWzI1GlOLt2au5aeqiIREwEi2sErRU/gUHCJFH1h1SfhADsw1i0xEC3C9lBU+SQCy8asEYZKnLMEsodVB2XhpBo0VkbR2dQad06kfPZoQ8qD5

jTs/3xVJswATiGIVw7tGZaTO0VUwTt2v091MRMq3L80dg765QH2JMc/VzVoVCbYzcElzdwi9tNme

zkzqtRnWIwCkc6gwfTsr+3mh4zIfyeB78/vTfdY84tYxh0Lxy1PXKP4SBUktaGUvuKDDsnycpoMK

hCJU/WgCsmBe4Aj6+4IbnK2gUSMBOba06Cm6cA==

jdk7 解碼簽名換行符去掉后: QXEvl/xDLanJ6GfB+eeZbawiKZwF3m1HzUr6r0GIk7DtWzI1GlOLt2au5aeqiIREwEi2sErRU/gUHCJFH1h1SfhADsw1i0xEC3C9lBU+SQCy8asEYZKnLMEsodVB2XhpBo0VkbR2dQad06kfPZoQ8qD5jTs/3xVJswATiGIVw7tGZaTO0VUwTt2v091MRMq3L80dg765QH2JMc/VzVoVCbYzcElzdwi9tNmezkzqtRnWIwCkc6gwfTsr+3mh4zIfyeB78/vTfdY84tYxh0Lxy1PXKP4SBUktaGUvuKDDsnycpoMKhCJU/WgCsmBe4Aj6+4IbnK2gUSMBOba06Cm6cA==

jdk8 解碼簽名: QXEvl/xDLanJ6GfB+eeZbawiKZwF3m1HzUr6r0GIk7DtWzI1GlOLt2au5aeqiIREwEi2sErRU/gUHCJFH1h1SfhADsw1i0xEC3C9lBU+SQCy8asEYZKnLMEsodVB2XhpBo0VkbR2dQad06kfPZoQ8qD5jTs/3xVJswATiGIVw7tGZaTO0VUwTt2v091MRMq3L80dg765QH2JMc/VzVoVCbYzcElzdwi9tNmezkzqtRnWIwCkc6gwfTsr+3mh4zIfyeB78/vTfdY84tYxh0Lxy1PXKP4SBUktaGUvuKDDsnycpoMKhCJU/WgCsmBe4Aj6+4IbnK2gUSMBOba06Cm6cA==--------------

true

結論

JDK1.7 編解碼

編碼

new sun.misc.BASE64Encoder().encode(byte[] array)

解碼

new BASE64Decoder().decodeBuffer(String str)

JDK1.8 編解碼

編碼

Base64.getEncoder().encodeToString(byte[] array)

解碼

Base64.getDecoder().decode(String str)

注意換行這個坑

1.8 變單例, 線程安全提升了

來源: https://www.cnblogs.com/leboxy/p/11463338.html

總結

以上是生活随笔為你收集整理的Java1.7版本解码base64_JDK Base64 编解码 1.7 和 1.8 的坑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。