4

我正在尝试使电晕疫苗接种中的 QR 码的内容清晰易读。找到以下页面。我只是不太明白如何读取扫描的字符串。

链接/认证 API

细绳:HC1:6BFOXN*TS0BI$ZD4N9:9S6RCVN5+O30K3/XIV0W23NTDEPWK G2EP4J0B3KLASMUG8GJL8LLG.3SA3/-2E%5VR5VVBJZILDBZ8D%JTQOL2009UVD0HX2JN*4CY009TX/9F/GZ%5U1MC82*%95HC2FCG2K80H-1GW$5IKKQJO0OPN484SI4UUIMI.J9WVHWVH+ZE/T9MX1HRIWQHCR2HL9EIAESHOP6OH6MN9*QHAO96Y2/*13A5-8E6V59I9BZK6:IR/S09T./0LWTHC0/P6HRTO$9KZ56DE/.QC$QUC0:GOODPUHLO$GAHLW 70SO:GOV636*2. KOKGKZGJMI:TU+MMPZ5OV1 V125VE-4RZ4E%5MK9BM57KPGX7K:7D-M1MO0Q2AQE:CA7ED6LF90I3DA+:E3OGJMSGX8+KL1FD*Y49+574MYKOE1MJ-69KKRB4AC8.C8HKK9NTYV4E1MZ3K1:HF.5E1MRB4WKP/HLIJL8JF8JF172M*8OEB2%7OREF:FO:7-WF11SKCU1MH8FWPVH%L635OBXTY*LPM6B9OBYSH:4Q1BQ:A5+I6:DQR9VKR8 BLHCFQMZA5:PHR14%GV4ZOP50$ A 3

显然这个字符串是由 CBOR Web Token 编码的。有谁知道我如何用 Java 或 PHP 解码它?

4

3 回答 3

3
  1. base45_decode()
  2. zlib_decode()
  3. CBOR_decode()到 headers1、headers2、cbor_data、签名
  4. CBOR_decode() cbor_data 到 greenpassdata
  5. JSON 将 greenpassdata 字符串化为 greenpass_json
于 2021-07-15T20:47:23.560 回答
2

添加到大卫的答案中,如果您还想验证签名,请通过base64 中的 查找签名证书kid,然后调用headers2[4]

require("cose-js").sign.verify(
  <result from step 2>,
  <public key of signing certificate>
)

(这是 Node.js,但可能有 Java 或 PHP 等价物)。

于 2021-07-17T12:17:27.770 回答
2

使用base45解码器:

composer require mhauri/base45

您可以解码字符串:

$base45 = new \Mhauri\Base45();
$decoded = $base45->decode(preg_replace("/^[^\:]+:/", "", $encoded));

请注意,我们忽略了前几​​个字符HC1:,它们是健康证书版本 (1),不是 base45 编码字符串的一部分。您现在有一个 zLib 压缩字符串。

然后您可以使用内置zilb_decode()方法解压缩字符串:

$decompressed = zlib_decode($decoded);

现在我们有了实际的 CBOR Web Token 字符串。下一步是将该字符串解析为一个数组。麻烦的是我只找到了两个开源的 PHP CBOR 包,这两个包都不适合这个任务。

2tvenom/cborencode软件包不支持标签(尚)。而且spomky-labs/cbor-php好像根本看不懂字符串,虽然是这么复杂的包,可能是我做错了什么。

我确定一定有办法,只是我还没有找到。目前,我正在使用https://ehealth.vyncke.org/index.php来了解有关 CBOR 的更多信息。如果你想出办法,请分享!

于 2021-08-08T11:05:10.673 回答