为什么数据中的00会破坏UTF-16编码/ OpenSSL?

时间:2014-05-08 14:29:39

标签: php login openssl utf-16

我正在进行PHP登录,该登录会获取ID并在用户已经过身份验证后将其记录在其他位置。它适用于除了其中三个之外的每个ID,它们都有一些共同之处:它们都以两个零开头(例如:0012)。

我想知道双零是否在编码中占有特殊位置,就像分隔符一样?或者与OpenSSL有关?它只打破了这三个。如果我将数据视为字符串或整数并不重要,它会打破两种方式。有什么想法吗?

代码(略有修改):

            $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); 

1 个答案:

答案 0 :(得分:0)

  

为什么数据中的00会破坏UTF-16编码/ OpenSSL?

OpenSSL的问题是。 OpenSSL只适用于数据 - 它不关心编码。它可能与openssl_sign有关。但目前很难说清楚。

您的问题可能与mb_convert_encoding有关。但是,你从未说明实际问题是什么。

它怎么行不通?在Linux系统上验证签名时它不起作用吗?您是否检查过字节订单标记(BOM)的存在(或不存在)?这是一个真正的问题,尤其是在使用Java时。