大家好,我是讯享网,大家多多关注。
作为后端产品经理,经常需要和外部系统接口。在设计开放平台接口的过程中,经常会涉及到接口传输安全的问题。笔者在详细查阅了大量资料后,结合自己以往的经验,对接口加密和签名的相关知识做了系统的总结,方便自己参考,也分享给大家做一些参考。如果你错了,请纠正我。
防伪装攻击即请求来源是否合法?(案例:在公共网络环境中,第三方 有意或恶意 的调用我们的接口)防篡改攻击(案例:在公共网络环境中,请求头/查询字符串/内容 在传输过程被修改)防重放攻击即请求被恶意攻击(案例:在公共网络环境中,请求被截获,稍后被重放或多次重放)防数据信息泄漏(案例:截获用户登录请求,截获到账号、密码等)
为了实现接口的安全性,本文从加密和解密以及签名算法两个方面进行了阐述。
一、加密解密的概念与算法1.1 为什么需要加密解密?
客户端与服务器交互时,必然会涉及到交互的消息(或者通俗地说,请求数据,返回数据)。如果您不希望消息以纯文本的形式传输,您需要对消息进行加密和解密。
所以加密的主要作用是避免明文传输。即使消息被拦截,拦截方也不知道消息的具体内容。
1.2 对称加密,单向加密,非对称加密的介绍与区别
加密分为对称加密和非对称加密:
对称加密效率高,但是解决不了秘钥的传输问题;非对称加密可以解决这个问题,但效率不高。(其中https是综合了对称加密和非对称加密算法的http协议。)
对称加密
采用单密钥加密,加密和解密可以同时使用同一个密钥。这种加密方法称为对称加密,也称为单密钥加密。
即约定一个密钥,客户端用这个密钥加密传输参数提交给服务器,服务器用同一个密钥解密;
1)常见的对称加密算法:
DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合;3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高;AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高,支持128、192、256、512位密钥的加密;
2)算法特点:
加密方和解密方使用同一个密钥;加密解密的速度比较快,适合数据比较长时的使用;密钥传输的过程不安全,且容易被激活成功教程,密钥管理也比较麻烦;
3)加密工具:
Openssl,使用libcrypto加密库,libssl库,即TLS/SSL协议的实现库等。TLS/SSL是一个基于会话的TLS/SSL库,实现了身份验证、数据机密性和会话完整性。
单向散列加密
单向加密也称不可逆加密算法,其密钥由密码哈希函数生成。单向哈希函数一般用于生成消息摘要、密钥加密等。
1)常用的单向哈希加密算法:
MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法,非可逆,相同的明文产生相同的密文;SHA(Secure Hash Algorithm):可以对任意长度的数据运算生成一个160位的数值。其变种由SHA192,SHA256,SHA384等;CRC-32,主要用于提供校验功能;
2)算法特点:
输入一样,输出必然相同;雪崩效应,输入的微小改变,将会引起结果的巨大变化;定长输出,无论原始数据多大,结果大小都是相同的;不可逆,无法根据特征码还原原来的数据;
3)加密工具:
MD 5 sum;sha1sumopenssl dgst
不对称加密
非对称加密是公钥加密,只有私钥可以解密。私钥是加密的,只有公钥可以解密。a首先生成一对公钥和私钥,然后向他人公开公钥进行加密。其他人用公钥加密消息并发送给A,A用私钥解密。反过来也一样。(发给某人,用某人的公钥加密。证明你的身份并用你自己的私钥加密)
非对称加密很少用于加密数据,而且速度太慢。它通常用于身份验证。发送方用对方公钥加密,可以保证数据的机密性(公钥加密);发送方用自己的私钥加密,可以实现认证(数字签名);
1)算法特点:
秘钥对,公钥(public key)和私钥(secret key)非对称加密可以解决秘钥传输问题,但效率不高。
基于非对称加密的特性,出现了以下两个问题:
问题1:如何确认通讯员证的有效性?
在第三方的帮助下:CA(认证机构)。CA为每个使用公钥的用户颁发一个带有CA签名的证书。该证书的作用是证明证书中的用户合法拥有证书中的公钥。CA组织的数字签名使得攻击者无法伪造和篡改证书。
CA本身有一个证书和一个私钥。任何人都可以获得CA的证书,并使用它来验证其颁发的证书的有效性。
假设机构A向CA发送一个证书颁发请求:(证书颁发过程)
CA首先生成一对公钥和私钥,并自签署一个CA证书certificate;A向CA提供自己的基本信息和自己的公钥;CA先对A的基本信息和公钥计算一个特征码,然后再使用自己的私钥对特征码进行加密,加密生成的字符串(数字签名)、A的公钥、A的基本信息共同组成了CA签发的数字证书;
有了CA颁发的数字证书,就可以通过CA来确认证书所有者的身份,从而解决了通信中的身份确认问题。
问题2:认证是通过CA实现的,那么如何保证数据的机密性?
保证数据的机密性无非就是加密数据。非对称加密由于加密速度慢,不适合加密通信数据。在实际通信过程中,身份确认后,通常采用对称加密对数据进行加密。如何协商对称加密的密钥?通常有以下两种方法。
方法:互联网密钥交换(IKE)算法
Diffie-Hellman算法密钥协商过程,假设A/B双传输进行通信,
1)在a/b通信之前,程先生p,g两个大素数,作为生成数。
2) A选择一个数字X,B选择一个数字y。
3) A/B加密结果如下:
A加密之后传递给B的内容: g^x%p –> BB加密之后传递给A的内容: g^y%p –> A
注:网上的用户可以看到:p,g,g x% p,g y% p。
4) A/B解密数据得到同样的结果。
A: (g^x%p)^x=g^xy%pB: (g^y%p)^y=g^xy%p
这样A/B就协商好了一个共同的密钥G XY% P,A/B双方通过非对称加密确认身份后,就可以用这个密钥加密通信数据了。
方法2:通过公钥加密协商密钥。
1) A随机生成一个字符串STR作为密钥,A用自己的私钥加密STR得到STR1,A用B的公钥加密STR2,A将STR2发送给B;
2)B收到STR2后,用B的私钥解密,再用A的公钥解密,最后得到密钥STR;
这样,A和B就完成了密钥的协商,协商出的密钥就是随机字符串str。
基于的常见非对称加密算法
RSA:由 RSA公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;既可以实现加密,又可以实现签名DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准);ECC(Elliptic Curves Cryptography):椭圆曲线密码编码;
与RSA相比,ECC在很多方面具有绝对优势,主要表现在以下几个方面:
抗攻击性强,相同的密钥长度,其抗攻击性要强很多倍。 计算量小,处理速度快。ECC总的速度比RSA、DSA要快得多。存储空间占用小,ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多,意味着它所占的存贮空间要小得多。这对于加密算法在IC卡上的应用具有特别重要的意义。带宽要求低,当对长消息进行加解密时,三类密码系统有相同的带宽要求,但应用于短消息时ECC带宽要求却低得多。带宽要求低使ECC在无线网络领域具有广泛的应用前景。1.3 加密算法
(1)DES加密算法
DES加密算法是一种分组密码,它以64位为一组对数据进行加密。其密钥长度为56位,加密和解密使用相同的算法。
DES加密算法是保持密钥秘密,而公开算法包括加密和解密算法。这样,只有与发送方拥有相同密钥的人才能解读DES加密算法加密的密文数据。
所以解密DES加密算法实际上就是搜索密钥的编码。对于56位密钥,如果使用穷举搜索方法,运算次数是256。
随着计算机系统能力的不断发展,DES的安全性将比它刚出现时弱得多。但从非批判性的现实出发,还是可以认为足够的。但是DES现在只用于旧系统的认证,更多的新加密标准被选用。
(2)AES加密算法
ES加密算法是密码学中的高级加密标准。加密算法采用对称分组密码系统。最小支持的密钥长度为128、192、256,块长度为128位。该算法应该易于由各种硬件和软件实现。
这种加密算法是美国联邦政府采用的块加密标准。该标准用于替代原有的DES,经过多方分析,在世界范围内广泛使用。
AES加密算法设计支持128/192/256位(/32=nb)数据块大小(即包长);支持128/192/256位(/32=nk)密码长度,对应十进制的34×1038,62×1057,1.1×1077个密钥。
(3)RSA加密算法
RSA加密算法是目前最有影响力的公钥加密算法,被普遍认为是目前最好的公钥方案之一。
RSA是第一个可以同时用于加密和数字签名的算法。它可以抵抗迄今为止所有已知的密码攻击,并已被ISO推荐为公钥数据加密标准。
RSA加密算法是基于一个非常简单的数论事实:两个大素数相乘是非常容易的,但在当时对它们的乘积进行因式分解是极其困难的,所以乘积可以作为加密密钥公开。
(4)Base64加密算法
Base64加密算法是用于在网络上传输8-8位字节代码的最常用的编码方法之一。Base64编码可用于在HTTP环境中传输长标识信息。
例如,在JAVAPERSISTENCE系统HIBEMATE中,采用Base64将一个长的唯一标识符编码成一个字符串,在HTTP forms和HTTPGETURL中用作参数。
在其他应用程序中,通常需要将二进制数据编码成适合放置在URL中的形式(包括隐藏的表单字段)。此时Base64编码不仅短,而且不可读,即编码后的数据人眼无法直接看到。
(5)MD5加密算法
MD5是一种广泛应用于计算机安全领域的哈希函数,用于保护消息的完整性。
MD5加密算法的简要描述可以是这样的:MD5将输入的信息处理成512位的数据包,每个数据包被分成16个32位的数据包。经过一系列的处理后,算法的输出由四个32位的包组成,将这四个32位的包串联后会生成一个128位的哈希值。
MD5广泛应用于各种软件的密码认证和密钥识别。MD5使用哈希函数,其典型应用是生成一条信息的摘要,防止被篡改。
MD5的典型应用是生成消息的指纹,以防止消息被“篡改”。如果有第三方认证机构,MD5还可以防止文档作者的“否认”,这就是所谓的数字签名应用。
MD5还广泛应用于操作系统的登录认证,如UNIX、各种BSD系统的登录密码、数字签名等。
二、签名的概念与方法2.1 为什么要签名?
1)客户端与服务器交互时,消息是加密的,但我们无法确认是谁发送的。比如在与第三方服务器B交互时,我们收到了一个加密的请求,但是我们无法确认消息是由服务器B发出的,这时候我们可以通过数字签名来验证。角色:身份验证数据源
2)如果我们收到一个服务器B签名的请求,那么服务器B也不能否认这个请求,因为它有它的签名,它的作用是反否认。
3)我们收到了来自服务器B的签名请求,但是我们无法确认这个请求是否被篡改(虽然消息是加密的,但也有可能被篡改)。这时,我们可以使用签名来验证签名的消息是否与传输的消息一致。功能:保证数据的完整性。
2.2 签名算法过程
签名的方式多种多样,常见的形式如下:
2.2.1 APPKEY+签名认证
1)除signature之外的所有请求参数按key升序排列,value不需要编码。(假设当前时间的时间戳是12345678)
比如有三个参数:c=3,b=2,a=1。添加时间戳后,按键排序为:a=1,b=2,c=3,_timestamp=12345678。
2)将参数名和参数值连接成一个字符串,得到组装字符:a1b2c3_timestamp12345678。
3)将应用的appkey连接到串接字符串的头尾,然后加密32位MD5,最后将MD5加密的摘要转换成大写。
例:假设appkey=test,MD5(test a1b2c 3 _ timestamp 12345678 test),得到MD5汇总值c5f3eb5d7dc2748ed89e90af0081e6。
风险在于,一旦appkey被他人获取,就可以模仿签名,造成安全问题。
2.2.2令牌+签名认证
令牌+签名认证的主要原理是:
1)制作一个认证服务并提供一个经过认证的webapi。用户提交相关身份信息,如供应商代码,并首先访问它。
2)服务器收到请求后,会验证相关身份信息。验证成功后,服务器会颁发一个令牌,令牌一般可以存储在缓存或数据库中,以便以后查询验证。然后将该令牌发送给客户端。
3)在接收到令牌之后,客户端可以将其存储,例如存储在Cookie或本地存储器中;每次客户端向服务器请求资源时,它都会在访问指定的api之前,使用相应的令牌、请求的参数和服务器提供的签名算法来计算签名。当服务器收到请求时,它会获得相应用户的令牌和请求的参数。服务器再次计算签名,并将其与客户端的签名进行比较。如果验证通过,将正常访问相应的api如果验证失败,它将返回特定的失败消息。
安全性的关键在于参与签名的令牌。token在整个过程中不参与通信,所以只要token不泄露,请求就不会被伪造。然后我们用时间戳时间戳来验证请求是否过期,这样即使有人拿走了完整的请求链接,也是无效的。
https模式
追求安全性,可以考虑https的双向认证模式+参数的sign签名规则,双重认证实现安全的请求后台。
本文最初由@发布丯丯丯丯丯丯丯丯丯丯丯丯丯丯丯丯丯丯丯𰵏丯𰵏丯20001
来自Unsplash的图像,基于CC0协议。
本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://51itzy.com/41906.html