2

在搜索如何完成签名时,我遇到了一些相当复杂的代码示例。但是下面的代码似乎就足够了。例如,这里是否缺少盐之类的东西,或者只是签名时不需要盐?我没有加密,只是签名。

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

byte[] data = Encoding.ASCII.GetBytes("hello");
byte[] signature = rsa.SignData(data, "SHA1");

byte[] dataTest = Encoding.ASCII.GetBytes("hello");
bool verified = rsa.VerifyData(dataTest, "SHA1", signature);
if (verified) Text = "True"; else Text = "Untrue";
4

1 回答 1

13

刚签名时不需要盐吗?

如果您的任务是防止对已知消息的哈希值进行预计算,其中哈希值被用作共享秘密,那么加盐是必要的。如果那不是您的应用程序,则无需加盐。

如果您不明白为什么需要盐,请参阅我关于该主题的系列文章:

http://blogs.msdn.com/b/ericlippert/archive/tags/salt/

这里有什么遗漏吗?

是的,缺少最重要的一步。你将如何传递公钥?整个系统的安全性依赖于你甚至没有提到的那一步。

假设爱丽丝希望向鲍勃发送一条消息,而鲍勃希望验证它来自爱丽丝。他们执行以下操作:

  • Alice 创建一个密钥对并安全地存储私钥。
  • Alice 发布公钥。
  • Bob 获得 Alice 的公钥。
  • Alice 发布一条消息。
  • Alice 对消息进行散列处理,并使用她的私钥对散列进行加密。
  • 鲍勃阅读了消息。
  • Bob 读取加密的哈希。
  • Bob 使用 Alice 的公钥解密加密的散列。
  • Bob 对消息进行哈希处理。
  • Bob 将解密的散列与消息散列进行比较。如果它们匹配,那么 Bob 就知道该消息是由 Alice 担保的。

这个对吗?

,结论不正确。结论应该是:

  • Bob 将解密的散列与消息散列进行比较。如果它们匹配,则 Bob 知道该消息是由拥有与 Bob 认为是 Alice 的公钥的公钥匹配的私钥的人担保的。

只有当 Bob 有额外的证据证明他拥有 Alice 的公钥时,最初的结论才是正确的。因为 Bob 可能处于这种情况:

  • Alice 创建一个密钥对并安全地存储私钥。
  • Mallory 创建密钥对并安全存储私钥。
  • Alice 发布公钥。
  • Mallory 截获 Alice 的发布,并用 Mallory 的公钥替换 Alice 的公钥。
  • Bob 获得了 Mallory 的公钥,但认为它是 Alice 的。

而现在,整个事情已经下地狱了。Mallory 现在可以发布 Bob 认为来自 Alice 的消息,而 Alice 不能!

您必须说明您将如何安全地发布公钥。整个系统依赖于两件事:私钥保持私密,并且有一些机制可以使公钥与其所有者正确关联。

于 2012-04-23T16:15:37.040 回答