JavaScript中的Base64编码与PHP中的解码

5
我将尝试使用JavaScript对字符串进行编码,并在PHP中进行解码。
我使用以下代码将字符串放入输入框,然后通过表单PUT发送:
document.getElementById('signature').value= b64EncodeUnicode(ab2str(signature));

并使用以下代码进行解码

$signature=base64_decode($signature);

这里有一个编码页面的jsfiddle链接:https://jsfiddle.net/okaea662/ 问题在于我总是得到一个字符串,大约有98%的正确性,但是存在一些不同的字符。例如:(第一个字符串是在输入框中打印的字符串)
¦S÷ä½m0×C|u>£áWÅàUù»¥ïs7Dþ1Ji%ýÊ{\ö°(úýýÁñxçO9Ù¡ö}XÇIWçβÆü8ú²ðÑOA¤nì6S+̽ i¼?¼ºNËÒo·a©8»eO|PPþBE=HèÑqaX©$Ì磰©b2(Ðç.$nÈR,ä_OX¾xè¥3éÂòkå¾ N,sáW§ÝáV:ö~Å×à<4)íÇKo¡L¤<Í»äA(!xón#WÙÕGù¾g!)ùC)]Q(*}?­Ìp ¦S÷ ä½m0×C|u>£áWÅàUù»¥ïs7Dþ1Ji%ýÊ{\ö°(úýýÁñxçO9Ù¡ö}XÇIWçβÆü8ú²ðÑOA¤nì6S+̽ i¼?¼ºNËÒo·a©8»eO|PPþBE=HèÑ qaX©$Ì磰©b2(Ðç.$nÈR,ä_OX¾xè¥3éÂòkå¾ N ,sá W§ÝáV:ö~Å×à<4)íÇKo¡L¤<Í»äA(!xón#WÙÕGù¾g!)ùC)]Q(*}?­Ìp 请注意第四个字符是不同的,然后还有一个或两个字符在其他地方。这个字符串对应于数字签名,所以这些字符使得签名无效。
我不知道这里到底发生了什么。有任何想法吗?我在Chrome浏览器中使用utf-8编码来处理头文件和元数据(Firefox似乎在输入框中使用了不同的编码,但我之后会解决这个问题)。
编辑:
显然,将其编码为base64不是问题。在浏览器和服务器中,base64编码的字符串是相同的。如果我在javascript中对其进行base64解码,我会得到原始字符串,但如果我在PHP中对其进行解码,我会得到一个略微不同的字符串。
编辑2:
我仍然不知道问题出在哪里,但我已经通过ajax将数据发送到blob中避免了这个问题。

2
所以你正在粘贴二进制数据,并期望文本输入框能够成功接受它们? - zerkms
我正在尝试在JavaScript中对字符串进行编码。 编码为哪种格式?不确定有什么要求? - guest271314
问题既不在JS中的编码,也不在PHP中的解码。问题在于你试图将来自外部来源的二进制数据复制并粘贴到HTML表单中。明智的做法是让外部来源使用base64[或其他7位安全编码]对数据进行编码,以确保数据通过系统时不会受到破坏。 - Sammitch
@zerkms 我不是在发送二进制数据。我正在发送Base64编码的数据。这就是编码的目的:不发送二进制数据。 - juanjo75es
@guest271314 如果您阅读该行以下的两行,您将看到 - juanjo75es
@Sammitch 如果您查看fsiddle,您会发现我没有粘贴二进制数据。我正在尝试编码W3C标准库生成的二进制数据(WebCrypto API)作为输出。我将base64编码粘贴到表单中。无论如何,如果我粘贴二进制数据(转义),我会遇到类似的问题。 - juanjo75es
1个回答

5

尝试使用以下命令利用js对您的字符串进行编码:

var signature = document.getElementById('signature');
var base64 = window.btoa(signature);

现在,通过php,您只需使用:base64_decode($signature) 如果这不起作用(我没有测试),可能是btoa的功能有问题。因此,请检查此链接:https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding 里面有一个函数应该可以解决问题(如果上面的方法行不通)。
function b64EncodeUnicode(str) {
    return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
        return String.fromCharCode('0x' + p1);
    }));
}

b64EncodeUnicode(signature); // "4pyTIMOgIGxhIG1vZGU="

我已经使用了b64EncodeUnicode。我也尝试过btoa和其他一些编码函数。总是出现类似的问题。 - juanjo75es
Base64 在浏览器中渲染或通过 URL 传递是不安全的。请参考 https://dev59.com/ep_ha4cB1Zd3GeqPsQqH#42165948 以获得一种安全的编码/解码任意字符串的方法。 - David Spector

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接