接口安全:加密与签名的区别

非对称加密算法(如RSA),正确的使用方法是公钥加密,私钥解密。

最近与三方合作伙伴对接接口安全方案,遇到一个同事跟我说,我们应该存储私钥,数据用私钥加密,公钥给三方,三方用公钥解密。我说不对,他给我看示例代码,里面明明是私钥加签,公钥验签

这种的误解,不仅造成了沟通上的困难,而且可能会导致接口设计并没有达到预设的安全目的。

所以这里想专门讲一下加密与签名的区别

  • 加密:对一段明文进加密,只有用指定的密钥才能解密,防止数据被窃取,泄漏
  • 签名:对一段明文进行签名,通过指定的密钥来验证签名,防止数据被篡改

加密很容易理解,基本上不会出现误解

通常误解出现在对签名的理解上,有很多人把签名也理解成加密,认为只要签名了,数据就不出被泄漏了,这是很大的一个误解。

划重点:签名的作用不是防泄密,而是防篡改

如何理解防篡改?给大家举个例子:

你经常给你的女朋友写信,里面有绵绵情话,有个快递员很坏,喜欢偷拆看别人的信,看完后再放回去。有一天,你发现你给女朋友写信的内容被曝光了,你意识到肯定是有人偷看了你写的信,于是你决定:

对信件内容进行加密

你采取了一套加密算法,如明文I love you,会被转化为密文:324678967702

你把解密的密钥给了女友,这样只有她能解密信件内容,这样快递员即使偷看了信,也不知道里面写的是啥。哈哈,你的目的达到了。

但是这个快递员真的很坏,他心怀不满,他说你不是不让我看你的信的内容吗?那么我就把你的信件给改了,比如,把I love you的密文:324678967702给改成1234567890,你女朋友收到信后,解密出1234567890的结果可能是:给我打一万块钱,分手吧,今天加班等,无论如何,反正不是l love you了,你女朋友很生气的问你,你信里都写的啥呀,莫名其妙的。你意识到,信件的内容肯定是被篡改了。你要防止别人篡改,你又有了新的想法。

对信息内容追加签名

你每次写完信,除了对信件内容进行加密外,还会用一套算法,针对密文生成一个签名,这套算法会保证,只要密文有任何改动,生成的签名都是不一样的。而且生成签名的密钥只有你和你女朋友知道。这使得任何人不能伪造内容的同时,也伪造签名。

当你女朋友收到你的信时,她首先会验签,即把信的内容用你给她的密钥也做一次签名,如果签名不一致,她就知道这封信一定被篡改过了,不能相信里面的内容。

这下任何人拿你的信件都没有办法了,即不能知道你信件的内容,也不能通过篡改来行骗或破坏你们的关系,从此你和女朋友过上了幸福美好的生活。

至此,我们理解了:签名与加密完全是两个概念,也不是必须一起都实现才安全,要根据需求而定。例如,我传输了一个下单信息:买一杯奶茶,这个信息并不是什么机密,但是要防止被人篡改改成:买2杯可乐,所以只需要对内容签名防篡改就可以了,并不需要加密。

为什么非对称加密算法(如RSA),正确的使用方法是公钥加密,私钥解密。

理解了加密和签名的区别,我们再来说说非对称加密中加密的实现为什么必须是公钥加密,私钥解密才是安全的。而签名却是私钥签名,公钥验签。

在python中的rsa加密实现中,根本就不支持公钥解密。(好多java小伙伴也许会说,我们在项目中私钥加密,公钥解密,用的好好的,难道说java没考虑到安全?从存在即合理的角度看,java支持这么做一定是有应用场景的)。难道是python太low了?为什么不允许私钥加密呢?

私钥和公钥的关系,相当于钥匙和锁的关系。

私钥=钥匙,公钥=锁,私钥只有一把自己保存,锁可以复制很多把。当要传输隐私数据时,就给对方一把锁,让对方把重要的隐私数据锁起来,传给你,然后你用私钥解锁。因为私钥在你手上,所以只有你能解锁。而公钥之所以叫公钥,意思是可以公开给任何人,任何人拿到一把锁都是没有意义。所以对锁的定义就是不能打开钥匙,即不能用私钥加密,公钥解密。

java的小伙伴说,我们的接口安全是这么实现的,服务端保存私钥,客户端保存公钥:

  1. 客户端请求接口时,用公钥加密,服务端收到信息用私钥解密
  2. 服务端返回的内容用私钥加密,客户端收到后,用公钥解密

这样用一对非对称密钥就可以完成整个交互的加密过程了,并不像你说的公钥可以公开给任何人,我们的公钥也是保密的,只给到指定的人或客户端。这里的第2步,其实是把公钥当私钥用了,来个了公私钥角色互换。也没有人说这么做不可以,反正只要保证“私钥”不泄漏就可以。

为了保证灵活性,所以java允许这么做,而python就要严格一点。

无论如何,我们永远要记住,私钥代表着你身份和权力,请保护好你的私钥。

说到这里,签名就好理解了,一定是私钥签名,公钥验签。毕竟私钥才能代表你的身份,你签名的文件,可以分发给任何人,也就是说任何人都需要拿到公钥来验证签名。如果反过来就不行了,任何拿到公钥的人都可以冒充你进行签名,那可是不行的。

 

 

你可能感兴趣的:(技术)