php base64_decode与java base64解密结果不匹配问题

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: php base64_decode与java base64解密结果不匹配问题

1.正常的字符串base64加密后,php和java都可以正常解析

例如:


原文:

this is a test


java代码:

String test = "this is a test";
System.out.println(new String(java.util.Base64.getEncoder().encode(test.getBytes())));
System.out.println(org.apache.commons.codec.binary.Base64.encodeBase64String(test.getBytes()));


java代码结果:

dGhpcyBpcyBhIHRlc3Q=
dGhpcyBpcyBhIHRlc3Q=


php代码:

<?php
        echo base64_encode('this is a test')."\n";
?>


php代码结果:

dGhpcyBpcyBhIHRlc3Q=


解析过程就不再列举了,解析结果都是可以还原原字符串。


2.特殊字符串(非base64加密的字符串结果)进行base64 decode解析结果不同

场景:公司某个业务的手机号php系统加密算法传输(涉及到base64加密),对端java系统进行解密(涉及到base64解密)

加密流程暂不列举,直接列举base64解密结果

加密原文:

MzMdWpavMBd+FBUoJWmdQeaqV5J1z57zXLKAn6NWtGhL1ygVtA

php代码:

<?php
        $string = base64_decode('MzMdWpavMBd+FBUoJWmdQeaqV5J1z57zXLKAn6NWtGhL1ygVtA');
        echo $string."\n";
        echo strlen($string)."\n";
?>

php代码结果:

33Z��0~(%i�A��W�uϞ�\����V�hK�(�
37

java代码:

String test = "MzMdWpavMBd+FBUoJWmdQeaqV5J1z57zXLKAn6NWtGhL1ygVtA";
String result1 = new String(java.util.Base64.getDecoder().decode(test.getBytes()));
System.out.println(result1);
System.out.println(result1.length());
String result2 = new String(org.apache.commons.codec.binary.Base64.decodeBase64(test));
System.out.println(result2);
System.out.println(result2.length());

java代码结果:

33Z��0~(%i�A�W�uϞ�\����V�hK�(�
35
33Z��0~(%i�A�W�uϞ�\����V�hK�(�
35

很明显,php解密的结果文本和字符串长度都与java不同

java解决问题:

1.查看解密后字节长度

java代码:

String test = "MzMdWpavMBd+FBUoJWmdQeaqV5J1z57zXLKAn6NWtGhL1ygVtA";
byte[] result1 = java.util.Base64.getDecoder().decode(test.getBytes());
System.out.println(result1.length);
byte[] result2 = org.apache.commons.codec.binary.Base64.decodeBase64(test);
System.out.println(result2.length);


java代码结果:

37
37

结论:字节长度相符,所以最终得到的字符串,并不是通过new String()生成。


2.查看php解密后ASCII码与java字节码的对比

php代码:

<?php
        $string = base64_decode('MzMdWpavMBd+FBUoJWmdQeaqV5J1z57zXLKAn6NWtGhL1ygVtA');
        for($i = 0; $i < strlen($string); $i++) {
            echo ord($string[$i])." ";
        }
?>


php代码结果:

51 51 29 90 150 175 48 23 126 20 21 40 37 105 157 65 230 170 87 146 117 207 158 243 92 178 128 159 163 86 180 104 75 215 40 21 180


java代码:

String test = "MzMdWpavMBd+FBUoJWmdQeaqV5J1z57zXLKAn6NWtGhL1ygVtA";
byte[] result1 = java.util.Base64.getDecoder().decode(test.getBytes());
for (int i = 0; i < result1.length; i++) {
    System.out.print(result1[i] + " ");
}
System.out.println();
byte[] result2 = org.apache.commons.codec.binary.Base64.decodeBase64(test);
for (int i = 0; i < result2.length; i++) {
    System.out.print(result2[i] + " ");
}


java代码结果:

51 51 29 90 -106 -81 48 23 126 20 21 40 37 105 -99 65 -26 -86 87 -110 117 -49 -98 -13 92 -78 -128 -97 -93 86 -76 104 75 -41 40 21 -76
51 51 29 90 -106 -81 48 23 126 20 21 40 37 105 -99 65 -26 -86 87 -110 117 -49 -98 -13 92 -78 -128 -97 -93 86 -76 104 75 -41 40 21 -76

对比后发现:


java的负数字节码与php的字节码结果相差256

ok,修改java解密逻辑,新增256的计算


java代码:

String test = "MzMdWpavMBd+FBUoJWmdQeaqV5J1z57zXLKAn6NWtGhL1ygVtA";
byte[] result1 = java.util.Base64.getDecoder().decode(test.getBytes());
StringBuffer sb1 = new StringBuffer();
for (int i = 0; i < result1.length; i++) {
    if (result1[i] > 0) {
        sb1.append((char) result1[i]);
    } else {
        sb1.append((char) (result1[i] + 256));
    }
}
System.out.println(sb1.toString());
System.out.println(sb1.length());
byte[] result2 = org.apache.commons.codec.binary.Base64.decodeBase64(test);
StringBuffer sb2 = new StringBuffer();
for (int i = 0; i < result2.length; i++) {
    if (result2[i] > 0) {
        sb2.append((char) result2[i]);
    } else {
        sb2.append((char) (result2[i] + 256));
    }
}
System.out.println(sb2.toString());
System.out.println(sb2.length());
String str3 = new String(result1, java.nio.charset.StandardCharsets.ISO_8859_1);
System.out.println(str3);
System.out.println(str3.length());


java代码结果:

33Z¯0~(%iAæªWuÏó\²£V´hK×(´
37
33Z¯0~(%iAæªWuÏó\²£V´hK×(´
37
33Z¯0~(%iAæªWuÏó\²£V´hK×(´
37


3.结论


1.非base64加密的标准数据,通过base64解码,php和java结果字符串不同


2.java获取base64解码的字节数组,长度与php解码长度一致,字节数字为正数,与php的ASCII码一致,负数的话,与php的ASCII码相差256;


3.也可以通过ISO_8859_1编码,获取到长度一致的字符串,遍历字符串每个char的int值,也是与php的ASCII码相同


4.不同的第三方jar解析base64,结果是一样的


5.长度和ASCII码都与php相同时,得到的字符串与php也不相同,暂时不知道什么原因


相关文章
|
6月前
|
存储 Java
java用base64编码案例
Java Base64编码示例:导入`java.util.Base64`,设置字符串`originalString`,使用`Base64.getEncoder().encodeToString()`编码并存储到`encodedString`,打印编码后字符串。解码用`Base64.getDecoder().decode()`。
61 0
|
6月前
|
安全 Java 编译器
深入理解PHP 8.0新特性及其对开发的影响Java中的多线程编程:从理论到实践
【5月更文挑战第27天】在这篇文章中,我们将详细探讨PHP 8.0的新特性以及它们如何影响开发者的工作流程。我们将深入研究这些新特性,包括JIT编译器,联合类型,命名参数,以及更多的错误处理机制。我们还将讨论这些新特性如何提高代码的可读性和性能,以及它们如何改变我们编写和维护PHP应用程序的方式。 【5月更文挑战第27天】在现代计算机科学中,多线程编程是一个重要的概念,它允许多个线程在同一时间内运行,从而提高了程序的效率和性能。本文将深入探讨Java中的多线程编程,包括其理论基础,实现方法,以及一些常见的问题和解决方案。我们将通过实例来理解如何创建和管理线程,以及如何使用Java的并发工具来
ly~
|
2月前
|
安全 Java 大数据
php跟java有什么区别
PHP 和 Java 是两种常用编程语言,各有特色。PHP 语法简洁灵活,适用于快速开发中小型网站,尤其在 Web 脚本和数据库交互中表现出色。Java 则语法严谨,强类型特性使其在企业级应用、移动开发及大数据处理中更受欢迎,具备高稳定性和安全性。通过优化,PHP 性能可提升,而 Java 在大规模应用中表现更佳。总体而言,PHP 开发效率高但维护性稍差,Java 则更注重代码质量和安全性。
ly~
47 5
|
3月前
|
存储 安全 Java
"Java编码魔法:揭秘图片与文件的Base64神秘转换术,让数据在指尖跳跃!"
【8月更文挑战第16天】Base64编码在Java开发中常用于将二进制数据如图片转换为ASCII字符串以便传输。编码使用64个字符及等号填充,每3字节数据编码为4个字符。Java利用`java.util.Base64`类实现此功能:读取图片或文件为字节数组后进行编码。解码时将Base64字符串还原为字节数组并写入文件。需注意编码效率降低、不提供安全性及特殊字符兼容性等问题。掌握这些技巧有助于解决Web开发中的数据传输需求。
96 4
|
3月前
|
PHP
PHP——将网络图片转为Base64
PHP——将网络图片转为Base64
46 1
|
3月前
|
Java 应用服务中间件 PHP
PHP——调用java文件中的方法
PHP——调用java文件中的方法
56 0
PHP——调用java文件中的方法
|
3月前
|
Java PHP 开发者
PHP中的异常处理:Java常见的编码方式
在PHP开发中,掌握异常处理至关重要,它有助于预见并管理运行时错误,避免用户体验受损或数据丢失。本文介绍PHP异常处理的基本概念与实践,包括try-catch语句的使用,以及如何通过抛出和捕获异常来增强代码的健壮性和可靠性。通过示例展示如何避免常见错误,如除数为零的情况,并探讨多catch块和finally语句的高级用法,帮助开发者提升程序稳定性与可维护性。[总字符数:238]
29 0
|
3月前
|
Java
Java 图片、文件 Base64 互转
Java 图片、文件 Base64 互转
71 0
|
5月前
|
Java PHP 数据安全/隐私保护
php和Java配合 aes
php和Java配合 aes加密
43 1
|
5月前
|
存储 Java 数据处理
Java的Base64加密解密详解
Java的Base64加密解密详解