【问题标题】:Can i digitally sign a string and then decrypt signature (both using keys) to regain original string?我可以对字符串进行数字签名,然后解密签名(都使用密钥)以恢复原始字符串吗?
【发布时间】:2016-09-22 06:03:06
【问题描述】:

我只需要生成与字符串对应的签名并将其存储在数据库中,然后当再次需要该字符串时,可以使用存储的签名从数据库中提取它(即通过解密签名)。

【问题讨论】:

  • 你应该为此散列,就像java中的MD5 stackoverflow.com/questions/415953/…
  • 如果您需要从存储的数据中检索原始字符串,那么您需要加密,而不是签名。签名允许您验证给定的数据片段是否与最初签名的字符串相同;他们不允许检索原始数据。 (签名是固定大小的;不可能从固定大小的签名中检索更长的原始字符串。)
  • 有很多方法可以做到这一点,但请说明您的要求。为什么需要将数据放入签名中?为什么需要加密?
  • 这个要求就像我需要将数据(由客户在表格中填写)存储到数据库中。然后此数据将转换为逗号分隔的字符串,并使用证书的(.p12 格式)私钥为该字符串生成签名。该签名也将存储在数据库中。现在以后,如果再次需要原来填写的数据,那么应该借助存储的签名来提取。 @Maarten Bodewes

标签: java cryptography digital-signature


【解决方案1】:

没有。签名涉及有损数据转换,因此您无法恢复原始数据。 (您只能出示数据、公钥和签名并询问“候选数据是否与此签名一起使用?”)

如果您需要证明它没有被篡改,那么您需要同时存储签名和数据。您可以将两者与 PKCS#7 SignedData 结构结合起来。 .NET 有 SignedCms 类来帮助解决这个问题,Java 可能也有类似的东西。

如果您想要的是使数据不可读,那么您想要的是加密,而不是签名(我最近在an answer to a different question 中讨论了一个区别,因为我'确定许多其他人都有)。如果您想使用证书并因此使用非对称操作,由于非对称加密的大小限制,您可能需要混合方案。

【讨论】:

    【解决方案2】:

    首先阅读此内容以便您了解该过程: https://crackstation.net/hashing-security.htm 然后使用这个: https://github.com/defuse/password-hashing。 快乐编码:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-02
      • 2023-04-02
      • 2016-03-24
      • 1970-01-01
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      相关资源
      最近更新 更多