openssl 加密与签名有什么区别?

openssl_private_encrypt 加密数据
openssl_sign 签名

签名在什么场景下使用?作用是什么?

阅读 4.7k
2 个回答

签名在什么场景下使用?作用是什么?

  1. 配合一个 key 防止串改。

  2. 单纯验证数据。(但是不需要知道原数据)

核心是散列算法,即你可以从 A 得到一个 B ,但是几乎不可能从 B 逆向得到 A 。

比如 "hello" 的 MD5 值是:5d41402abc4b2a76b9719d911017c592 。

再比如我给你一个 MD5 值 a2891da3bb01b6b8406521b844ba1a20 ,这是 B ,你几乎不可能算出它是哪个字符中的 MD5 值。

ssl的签名, 更多的是对来源的认证. 一般SSL的做法是, 服务器公开自己的公钥, 任何客户端都能拿到服务器的公钥证书. 我们的浏览器SSL客户端就是使用这个 对方主动发给你的证书 , 要求你用这个证书来做不对称加密来沟通你们的通讯加密密码的.

SSL的这种不对称加密, 理论上是只要有一对 公钥私钥 证书, 就可以达到两个通讯节点的通讯内容不被窃听和篡改. 但是有一个条件, 就是这个公钥和私钥都是正确的, 没有被替换过的情况下才可以.

例如你现在要访问: https://sf.gg 这个网址, 你请求发出去了, 你收到了某个网络的返回的公钥 (我们假定你家的网线有可能被黑客拦截). 因为这个公钥是被主动塞过来的, 我们不知道是黑客塞的, 还是真的是 sf 的服务器塞的. 这个时候我们就需要通过签名来确认, 这个 公钥 证书是不是真的 sf 服务器发给你的.

大概的方法就是, 我们用我们系统自带的, 可信机构的根证书来检验这个 公钥 证书的签名是否有效. 一般签名信息是可信的根证书机构, 用他们的私钥来对证书主要内容计算后, 再用私钥来对计算值加密. 我们可以用系统对应的根证书公钥来解开这个加密后的值, 并且本地对证书内容进行一样的主要内容计算, 匹配解密后的值和计算的值是否一致, 一致的话, 就可以认为这个 sf 的 公钥 的确是由某个我们系统信任的根证书机构签名认证的.

简单就是我们要知道网站的公钥证书是否是真实可信的, 我们通过这样的关系连来确认:
我们 <-信任-> 系统根证书机构 <-证明-> 网站证书

通过我们信任某个机构, 这个机构也为这个投递够来的证书做担保, 那么我们就可以认为证书是真的. 接下来就是用这个真的证书来做后续加密握手处理就可以了.

如果我们收到是一个黑客自己伪造的证书, 由于没有任何一个根证书机构为其证书做担保,
所以我们的系统就不会信任那个假的证书了. 但是由于所有的可信性都是通过系统根证书来保证的, 假如黑客能够成功的在你的系统上安装一个他自己的根证书, 并让我们系统信任那个证书, 那么黑客就可以利用那个证书, 来自行对所有网站域名来签发任何证书, 而我们系统无法察觉到这个威胁.

SSL最复杂的就是这种信任授权等逻辑, 至于数据的加密解密倒是一个纯粹的理论问题, 涉及的一个无限大的公因数的互为加密和解密的算法问题.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题