刚签名时不需要盐吗?
如果您的任务是防止对已知消息的哈希值进行预计算,其中哈希值被用作共享秘密,那么加盐是必要的。如果那不是您的应用程序,则无需加盐。
如果您不明白为什么需要盐,请参阅我关于该主题的系列文章:
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 不能!
您必须说明您将如何安全地发布公钥。整个系统依赖于两件事:私钥保持私密,并且有一些机制可以使公钥与其所有者正确关联。