api接口的工作原理(API接口加密方式)

服务端和客户端加密、解密采用的是同一个秘钥,密钥安全决定该算法安全性,如果一方的秘钥被泄露,那么该加密信息就是不安全的,现在小编就来说说关于api接口的工作原理?下面内容希望能帮助到你,我们来一起看看吧!

api接口的工作原理(API接口加密方式)

api接口的工作原理

背景:

服务端和客户端加密、解密采用的是同一个秘钥,密钥安全决定该算法安全性,如果一方的秘钥被泄露,那么该加密信息就是不安全的。

不安全因素

客户端将秘钥写死,如果手机被暴力破解,密码泄露,app不能热更新的情况下,想要换秘钥需是要耗费较长的时间(修改、上线、审核、发版等),这段时间内,损失不可估量。

根据客户端版本来维护每个版本的秘钥,时间长了秘钥也会很多,维护麻烦

内部员工离职,了解公司内部加密方式及秘钥,对于公司来说是很不安全的;如果拿到接口文档资料,那肯定是公司内部员工,泄露接口文档及加密方式导致的损失是需要负法律相关责任

我们为什么要采用这种方式?

    对称加密的密钥每次都随机生成,为动态密钥

    通过非对称加密对秘钥进行保护,防止秘钥明文泄露

    RSA运算速度慢,所以采用运算速度快且安全性高的对称密钥密码体制中的AES对所有传输数据进行加密,然后再用RSA对AES密钥加密,这样既能保证安全又能保证性能。

    RSA公钥和私钥由服务端生成,公钥放在客户端,私钥放在服务端。

    数据加密后采用Base64编码,数据解密前采用Base64解码。

实现过程

采用对称加密和非对称加密结合方式,公钥下发于客户端,私钥保存于服务端,客户端根据一定规则生成对称加密的秘钥。

字段定义

字段名称 描述 数据格式 是否密文 key 秘钥,客户端随机生成 string 否 iv 向量,约定好即可,可为空 string 否 encrypt_key key非对称加密后结果 base64_encode 是 encrypt_iv iv非对称加密后结果 base64_encode 是 ciphertext 请求参数对称加密后结果 base64_encode 是

生成秘钥

    使用支付宝提供的一键生成工具(解压打开文件夹,直接运行“RSA 签名验签工具.bat”(WINDOWS)或“RSA 签名验签工具.command”(MAC_OSX),点击“生成 RSA 密钥”,会自动生成公私钥,然后点击 打开文件位置,即可找到工具自动生成的密钥。具体步骤请参考签名专区生成RSA密钥指南。)Windows:下载MAC OSX:下载

    使用 OpenSSL 工具命令生成首先进入 OpenSSL 工具,再输入以下命令。 OpenSSL> genrsa -out rsa_private_key.pem 2048 #生成私钥(128|256|512|1024|2048) OpenSSL> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem #生成公钥 OpenSSL> exit #退出OpenSSL程序 经过以上步骤,可以在当前文件夹中(OpenSSL运行文件夹),看到 rsa_private_key.pem(RSA私钥)和 rsa_public_key.pem(对应RSA公钥)2个文件。

首先,看一个加密处理后的实例数据

g016aVzqgWoep20f6MgvLdKNOlT1Abg EXgoqdCBa3F1fzUpmqROxbF4okjo XHiEohhloC/mKN9cRQwLuH9we7icYkKmRY7fsgRhj8mkudgDPwj Lk3iIox0UUIO4piEl/kfEj/sDNsVdBckEMS5VVUyV YDkw3YFh/7uydUB84=.S0ohQERHZHQmM0hubHNvOTZoOw==.F1ZXeH3XhkJ5UptOb3Sr7P CN2yW 1zFMPyrNrY9HzdTejjsqxCo 0OcVUCL7bf dZC4LAibdr6RFsvJdZLpPvQ==

特点1.整个数据为三段,以"."作为分隔符,形如:aaa.bbb.ccc,第一段为非对称加密后的秘钥,第二段为向量base64_encode后的结果,第三段为对称加密后的请求参数

BINGO!但是为什么会用.作为分隔符呢? 作为分隔符,只要能达到与内容区别、不重复的目的,什么符号都可以。比如:"|"(竖线)、"_"(空格)等。

特点2.每段数据均为base64_encode数据,如下图对比

Sectionbase64_encodebase64_decodeencrypt_key g016aVzqgWoep20f6MgvLdKNOlT1Abg EXgoqd CBa3F1fzUpmqROxbF4 okjo XHiEohhloC/mKN9cRQwLuH9we7icYkKmRY7f sgRhj8mkudgDPwj Lk3iIox0UUIO4piEl/kfEj/sDNsVdBckEMS5VVUyV Y Dkw3YFh/7uydUB84= 8:5ބiڈڝ^˖^Ө5Y)<8ĘRbL%IF�$�dĴܑ�u慫KmZ悳 q**탻{ذA�޷کϝJوlӋ�)噬փq(x�ĸ5Qטi�W��[ ږ j��dqmګÅ�귺-�2R~,�ɬ�H;'m۴ﵳ)R�u��ʡ ��ʔ 몜걖]��e=k�BY22ݺƾ.W¤�"7gW(| ciphertext F1ZXeH3XhkJ5UptOb3Sr7P CN2yW 1zFMPyrNrY9HzdTejjsqxCo 0OcVUCL7bf dZC4LAibdr6RFsvJdZLpPvQ== 嬦5 қI޺X#3L�ﶮ�ڌ鎏mAR/"�$ �vLچԃencrypt_ivS0ohQERHZHQmM0hubHNvOTZoOw==KJ!@DGdt&3Hnlso96h;

从上面的数据可以看出,base64加密之前都是2进制数据,采用base64把非ASCII字符的数据转换成ASCII字符,避免不可见字符。

客户端发起请求

    客户端按一定规则生成key和iv(如数字、大小写字母、特殊符号等随机16位字符:Mvx#f^WGM1DQcY9F)

    客户端采用非对接加密利用公钥将key进行加密,生成结果encrypt_key

    客户端采用base64将iv进行加密,生成结果encrypt_iv

    客户端用key、iv将请求参数进行对称加密,生成结果ciphertext

    将encrypt_key、encrypt_iv、ciphertext用.拼接生成结果,用拼接结果来请求服务端接口

服务端处理请求

    服务端收到请求后拆解为三部分(第一部分为key非对称加密后的结果encrypt_key,第二部分为iv利用base64加密后的结果encrypt_iv,第三部分为使用key和iv对称加密后的结果ciphertext)

    使用私钥对encrypt_key进行非对称解密,取得key

    使用base64对encrypt_iv进行解密,取得iv

    利用key和iv对ciphertext进行对称解密,获取到客户端的请求参数

    服务端针对当前请求地址及参数进行业务处理,将处理结果用key和iv对称加密返回给客户端

客户端处理结果

    客户端收到服务端返回的结果直接用请求接口时的key和iv进行对称解密即可

总结

上面网络通信过程是安全的,可以保证通信数据即使被截取了,也无法获得任何有效信息;即使被篡改了,也无法被客户端和服务端验证通过。

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页