使用数字签名来保护QR码

spo*_*oko 5 java encryption qr-code digital-signature

我正在寻找类似"倒置非对称密码术"的东西,并且遇到了一个很棒的帖子,它实际上涵盖了我需要的东西.

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

这有点误会了.我认为使用数字签名会有一个简单的情况(让我们称之为Situation A):

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

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

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

我在这儿吗?如果是这样,我如何将我的消息和签名放在QR码中?事情似乎很容易,Situation A因为我只能使用Base64编码加密的消息,并将结果放在QR码中.然而,看起来我不能不使用像这样的技巧做同样的事情encode message, encode signature, put them in one file, encode it, put the result in the code.那我该怎么办?

哦,还有一个问题"QR码安全"答案说:

你可以把QR码你想要的任何东西,包括代表签名的文档的Base-64编码的字节.没有读者会知道如何处理它; 你必须写扫描,然后知道将其解码并采取相应的行动定制的应用程序.

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

spo*_*oko 1

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

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

  1. 签署我的消息
  2. 使用 base64 对消息和签名进行编码
  3. 将两个字符串合并为一个字符串,如下所示

    base64(message)-base64(signature)
    
    Run Code Online (Sandbox Code Playgroud)
  4. Base64() 上面的字符串如下所示:

    base64(base64(message)-base64(signature))
    
    Run Code Online (Sandbox Code Playgroud)
  5. 将编码后的字符串放入二维码中。

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

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