【问题标题】:Using digital signature to secure QR code使用数字签名保护二维码
【发布时间】:2015-02-27 02:48:54
【问题描述】:

我一直在寻找类似“反向非对称加密”的东西,遇到了 great post,它实际上涵盖了我需要的内容。

我希望我的应用程序的每个用户都有一个公钥,允许他们解密隐藏在二维码中的消息,该二维码是用我的私钥加密的。我想确保我的系统不会被覆盖我的假二维码所欺骗。接受的答案建议使用数字签名,所以我在 Google 上搜索了 Java tutorial,展示了如何使用该功能。

这里有点误解。我以为使用数字签名,会有一个简单的情况(姑且称之为Situation A):

  1. 消息使用私钥加密
  2. 用户读取加密消息
  3. 用户使用公钥解密消息。

但是,我的理解是数字签名更像是:

  1. 使用私钥和消息创建数字签名。
  2. 用户需要原始消息和签名文件。
  3. 用户使用数字签名来验证消息没有被更改并且来自我。

我在这里吗?如果是这样,我怎样才能将我的消息和签名都放在二维码中?在Situation A 的情况下,事情似乎很简单,因为我可以简单地使用 Base64 对加密消息进行编码并将结果放入 QR 码中。但是,如果不使用encode message, encode signature, put them in one file, encode it, put the result in the code 之类的技巧,我似乎无法做同样的事情。那我该怎么做呢?

哦,还有一个answer from question "QR code security"说:

您可以在 QR 码中放入任何您想要的内容,包括表示已签名文档的 Base-64 编码字节。没有读者会知道如何处理它;您必须编写一个自定义应用程序来扫描,然后知道对其进行解码并采取相应措施。

根据前面提到的教程,看起来签名文档本身是不够的。

【问题讨论】:

  • 你的情况 A 没有意义。可以通过公钥解密的加密是没有意义的。
  • @EJP 好吧,可以用它来代替签名...
  • @spoko 是的,签名会创建一个签名文件,一个附加文件。但是,根据签名文件格式,签名文件可能会嵌入签名数据。
  • @EJP 我希望每个人都能解密我的消息,但与此同时,我是唯一可以创建有效二维码的人。这样,如果有人试图攻击我的系统(创建一个带有假二维码的贴纸并物理覆盖我的系统),用户应用程序将不会读取任何有用的信息,并且无法正常工作,而不是执行攻击者想要的操作。我不会说这毫无意义。
  • 所以你需要数字签名,而不是加密。通常的做法是签署消息摘要并将其与消息一起发送。

标签: java encryption qr-code digital-signature


【解决方案1】:

当我问这个问题时,我假设有某种好习惯或类似的东西。由于没有提供,我决定使用自己的解决方案,有点类似于 DarkSquirrel42 的建议。

我创建了自己的编码器和解码器。实际上,我完全使用了我在原始帖子中描述的相同技巧。

  1. 签署我的消息
  2. 使用 base64 对消息和签名进行编码
  3. 像这样将两个字符串组合成一个字符串

    base64(message)-base64(signature)
    
  4. Base64() 上面的字符串是这样的:

    base64(base64(message)-base64(signature))
    
  5. 将该编码字符串放入二维码中。

  6. 我的解码器 - 我解码 base64 的第一层,将结果字符串拆分为 messagesignature 部分(这就是 3. 中有连字符的原因)然后我传递消息如果签名正确,则交给适当的处理程序。

【讨论】:

  • 请注意,每个 base64 层都会给您带来大小开销 ... base64 需要 3 个字节的输入并输出 4 个字符,每个字符的大小通常为 1 或 2 个字节,具体取决于在你的字符集上......
  • 我认为不需要最后一个 base64 编码。鉴于签名是静态大小的,您不妨简单地将消息和签名连接起来,并对其进行 base64 编码(或者,如果消息已经对 QR 码有效,则保留它)。这将删除最后一个 base64 编码和 base64 的行尾开销。如果您真的很保守,您还可以从 base64 编码中删除任何行尾和填充字符。
【解决方案2】:

请注意,如果您之前处理的是小消息,您的消息大小会显着增加 ...

签名与额外的文件或其他东西无关......您可以完美地计算它们并在只处理文本时使用它们......

例如 PGP 就是这样做的……

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

<your message here>

-----BEGIN PGP SIGNATURE-----  
Version: GnuPG v1.4.9 (GNU/Linux)  

<some base64 encoded data holding the signature>  
-----END PGP SIGNATURE-----  

现在,您不必完全像 pgp 那样做,但是,您只需要一些结构来区分消息和签名...

例如,如果您知道您的消息可能不是很长,只需定义前 2 个字节定义消息长度,然后在前面加上 ....

如果你愿意,下一步可以用 base64 编码整个东西,你知道如何从那里开始

【讨论】:

  • 感谢您的回复。事实上,我最终得到了类似的结果。
猜你喜欢
  • 1970-01-01
  • 2020-07-26
  • 2017-02-05
  • 1970-01-01
  • 2020-07-18
  • 2014-04-21
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
相关资源
最近更新 更多