Php 为什么数据中的00会破坏UTF-16编码/OpenSSL?
我正在开发一个PHP登录,它接受一个ID,并在用户经过身份验证后将其登录到其他地方。它适用于除三个ID之外的每个ID,它们都有一个共同点:它们都以两个零开始(例如:0012) 我想知道双零在编码中是否有特殊的位置,比如分隔符?或者与OpenSSL有关?它只在那三个上断开。不管我是将数据视为字符串还是整数,它都会双向中断。有什么想法吗 代码(稍作修改): 为什么数据中的00会破坏UTF-16编码/OpenSSL 问题不在于OpenSSL。OpenSSL只处理数据—它不关心编码。它可能与openssl签名有关。但现在很难说 您的问题可能与Php 为什么数据中的00会破坏UTF-16编码/OpenSSL?,php,login,openssl,utf-16,Php,Login,Openssl,Utf 16,我正在开发一个PHP登录,它接受一个ID,并在用户经过身份验证后将其登录到其他地方。它适用于除三个ID之外的每个ID,它们都有一个共同点:它们都以两个零开始(例如:0012) 我想知道双零在编码中是否有特殊的位置,比如分隔符?或者与OpenSSL有关?它只在那三个上断开。不管我是将数据视为字符串还是整数,它都会双向中断。有什么想法吗 代码(稍作修改): 为什么数据中的00会破坏UTF-16编码/OpenSSL 问题不在于OpenSSL。OpenSSL只处理数据—它不关心编码。它可能与openss
mb\u convert\u编码有关。但是,您从未说明实际问题是什么
它怎么不起作用?在Linux系统上验证签名时,它不起作用吗?是否检查是否存在(或不存在)字节顺序标记(BOM)?这是一个真正的问题,尤其是在使用Java时。旁注:您可以使用$priv\u key=openssl\u pkey\u get\u private(“file:///OpenSSL-Win64/bin/myrsakey.pem");代码>开始时的双零是区分这些ID和其他ID的唯一方法吗?或者这些通常是唯一以零开头的吗?还有很多其他ID,它们可以是4个数字的任意组合(例如:12342454)。它只在以00开头的ID上断开。所有其他数据都是相同的。openssl\u是否在创建签名成功后立即使用$data
上以00开头的公钥验证
?是的,无论情况如何,它都返回true。它应该在重定向到URL后登录成员;它适用于任何不以双零开头的ID。我还假设它与mb\u convert\u编码相关。在它离开我的终端之后,虽然这取决于另一方(我没有访问权限)来接受该数据,所以除了继续发送请求之外,我的测试非常有限。我只是想确保我这边的一切都正常,或者如果有人看到过类似的东西。我还没有尝试在Linus系统上测试它,也没有涉及Java。只是PHP。
$fp = fopen("/OpenSSL-Win64/bin/myrsakey.pem", "r");
$priv_key = fread($fp, 8192) or die("File not found.");
fclose($fp);
$pkeyid = openssl_get_privatekey($priv_key);
$data = '0012'; // THIS DOESN'T WORK
$data = '0123'; // THIS DOES WORK
$data = '1234'; // THIS ALSO WORKS
$data = mb_convert_encoding($data, "UTF-16LE");
openssl_sign($data, $signature, $pkeyid, OPENSSL_ALGO_SHA1);
openssl_free_key($pkeyid);