【问题标题】:Why would 00 in data break UTF-16 encode / OpenSSL?为什么数据中的 00 会破坏 UTF-16 编码/OpenSSL?
【发布时间】:2014-05-08 14:29:39
【问题描述】:

我正在开发一个 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); 

【问题讨论】:

  • 旁注:您可以使用$priv_key = openssl_pkey_get_private("file:///OpenSSL-Win64/bin/myrsakey.pem");简单地加载您的私钥
  • 开头的双零是唯一能将这些 ID 与其他 ID 区分开来的东西吗?或者那些通常是唯一以零开头的?
  • 还有很多其他的ID,它们可以是4个数字的任意组合(例如:1234、2454)。它只在以 00 开头的 ID 上中断。所有其他数据都相同。
  • openssl_verify在创建签名后立即使用以00开头的$data上的公钥成功了吗?
  • 是的,无论如何它都会返回true。

标签: php login openssl utf-16


【解决方案1】:

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

不是 OpenSSL 的问题。 OpenSSL 只处理数据——它不关心编码。它可能与openssl_sign 有关。但目前很难说。

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

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

【讨论】:

  • 它应该在重定向到 URL 后登录会员;它适用于任何不以双零开头的 ID。我还假设它与mb_convert_encoding 有关。在它离开我之后,尽管由另一方(我无权访问)来接受该数据,所以我的测试非常有限,而不仅仅是继续发送请求。我只是想确保我最后的一切都被扼杀,或者如果有人看到过类似的东西。我还没有尝试在 Linus 系统上测试它——也没有涉及 Java。只是 PHP。
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 2012-03-16
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
相关资源
最近更新 更多