这足以签署数据吗?

时间:2012-04-23 14:15:14

标签: c# cryptography rsa signing

搜索签名的方式我已经遇到了一些相当精细的代码示例。但是下面的代码似乎已经足够了。这里有什么东西像盐一样缺少,或者只是签字时不需要盐吗?我不加密,只是签名。

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";

1 个答案:

答案 0 :(得分:13)

  

签署时是否不需要盐?

如果您的任务是阻止预先计算已知消息的哈希,则哈希是必要的,其中哈希被用作共享密钥。如果那不是你的申请,那就没有必要加盐。

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

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

  

这里缺少什么东西吗?

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

假设Alice希望向Bob发送消息,Bob希望验证它是否来自Alice。他们执行以下操作:

  • Alice创建密钥对并安全地存储私钥。
  • Alice发布公钥。
  • Bob获取Alice的公钥。
  • Alice发布消息。
  • Alice散列邮件并使用私钥加密哈希。
  • Bob读取消息。
  • 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则不能!

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