这足以签署数据吗?

isp*_*iro 2 c# cryptography signing rsa

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

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";
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 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知道该消息是由Alice担保的.

它是否正确?

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

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

如果Bob有其他证据证明他有Alice的公钥,那么原始结论才是正确的.因为Bob可能处于这种情况:

  • Alice创建密钥对并安全地存储私钥.
  • Mallory创建密钥对,安全性存储私钥.
  • Alice发布公钥.
  • Mallory拦截Alice的出版物并用Mallory的公钥替换Alice的公钥.
  • Bob获得了Mallory的公钥,但认为它是Alice的公钥.

而现在整个事情都变成了地狱.Mallory现在可以发布Bob认为来自Alice的消息,而Alice则不能!

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

  • @ispiro:如果您购买证书,证书颁发机构将为您担保.如果要对代码进行签名,则可以使用代码签名证书.您还可以在可靠的SSL站点上发布您的公钥(或将其嵌入下载中)(现在,SSL站点正在为您担保,并且站点的证书颁发机构正在为该站点担保),提供具有全息安全性的CD(在这是一种令人费解的方式,这就是微软为担保证书颁发机构的公钥提供担保的方式,通过电话呼叫用户并以十六进制读出公钥等. (4认同)