接口加密问题

9 天前
 XuYijie
亲爱的同僚们,我目前在学习接口加密,就是请求参数和返回值加密,假如使用 rsa 的话:服务端生成一个密钥对,前端生成一个密钥对,互相交换公钥,就可以使用彼此的公钥和自己的私钥进行加密解密了,问题是前端的私钥存在哪里呢?放在代码里,本地存储里,cookie 里,都有被盗取的风险吧,难道是不存储密钥,每次调用接口都要临时生成秘钥吗?
2215 次点击
所在节点    程序员
31 条回复
FengMubai
9 天前
是的, 一次一密. 客户端私钥只存在于内存里
XuYijie
9 天前
@FengMubai 好的,没做过要求加密的项目,不敢往那方面想,听说 rsa 密钥生成挺消耗性能的
soar0712
9 天前
服务器生成 rsa 公私钥对,公钥是公开的,前端 js 生成 aes key ,用 aes 加密明文数据,用服务器的公钥加密 aeskey ,将加密后的数据和加密后的 aeskey 都传给服务器,服务器用私钥解数据拿到 aeskey ,再用 aeskey 解密密文,最后拿到明文数据
soar0712
9 天前
@soar0712 这只是最基础的加密逻辑,还需要加上时间戳校验、哈希校验什么的,也就是防重放那一套逻辑
ren2881971
9 天前
不是这样的 如果加密数量量比较大的话,非对称加密的性能很差。
一般都是通过密钥协商出来一个对称密钥对通信中的数据进行加密。比如:
在客户端侧:客户端私钥+服务端公钥进行密钥协商
在服务端侧:服务端私钥+客户端私钥进行密钥协商。
协商出来的这两个密钥是一致的,你就可以当作是对称密钥来用。 在协商过程中。双方的私钥不见面,而且也不涉及到对称密钥传输的问题。
HTTPS 或者说 TLS 就是大致这么做的。
但听你的需求,你好像是想做信源加密。那你做数字信封就好。就是用服务端的公钥对数据加密密钥做加密,然后数据加密密钥对数据做加密,如果有防篡改的需求,也可以做个签名。
ren2881971
9 天前
一般单向 TLS/SSL 认证就够用啦,它来帮你做信道保护。
你用数字信封做个信源加密就好。 客户端生成个随机数作为数据加密密钥就够了。
XuYijie
9 天前
@ren2881971 我纠结的是,客户端这边存放密钥的安全性问题,特别是 web 项目,协商出来的密钥一放到前端那不是 f12 就能找到
Kathy1989
9 天前
放环境变量 env 里
FengMubai
9 天前
@XuYijie #2 所以一般用 aes 加密, 用服务端公钥把 aes 密钥加密后发出去
ren2881971
9 天前
@XuYijie 客户端不用私钥呀。 你每次通信的时候 都是客户端生成的随机数作为 对称加密密钥 A ,这个密钥是个临时的,只对本次会话负责。 对称加密密钥 A 加密数据,然后用服务器的公钥 B 加密 A 就好了。把加密好的 A 和加密数据 一同发给后端服务。
ren2881971
9 天前
服务端接收数据后,用服务端的私钥解密,获得密钥 A ,然后再用密钥 A 解密数据就好。
XuYijie
9 天前
@ren2881971 嗷嗷,也是每次请求重新生成,好的好的
ren2881971
9 天前
@XuYijie 其实就是生成个伪随机数而已。 对性能也没啥损耗,1 、起到了保护作用。2 、一次性密钥也不用费神研究密钥保护的事情。
renoooo
9 天前
那服务端的公钥被盗取之后不是也一样可以走这套流程往服务端发数据吗
@ren2881971
hefish
9 天前
参见 DH 密钥交换算法。
XuYijie
9 天前
@renoooo 能盗取服务端密钥的只能是顶级黑客,而客户端的密钥一般我就能盗取
kuanat
9 天前
#3 @soar0712 说的就是标准做法。

现在不明确的是为什么要加密,防的是谁。谁让你这么干就问他,这么干的目的是什么,只有这么一种实现方式么,这么做能抵御哪些攻击。

提这个需求的大概率不懂,所以你也会跟着迷糊。你也可以试着思考一下,然后再过渡到为什么要存密钥,有没有必要存密钥,如果有必要存到哪里的问题。

当然我个人的意见是前端针对请求参数和返回值“加密”是没什么意义的(除非这个网页应用就是提供 e2e 加密的),搞“签名”还可以防机器人。
XuYijie
9 天前
@kuanat 我也想不通有 https 为什么还需要对整个接口数据进行加密,但是确实存在这样的公司,例如国家医保的支付接口
renoooo
9 天前
@XuYijie ren2881971 说的方法是防止信道不安全的问题,你的问题是服务器识别信源的问题,识别信源的问题就是要每次都要生成新的,soar0712 说的这种就是识别信源,你也可以了解一下 kerberos
kuanat
9 天前
@XuYijie #18

可能是比较机械地执行等保规定吧……既然这样的话,按照对面的要求执行就是了。

如果直接用非对称加密,你只需要拉取公钥。如果用对称加密,你一样要拉取公钥,对称加密的密钥肯定是用非对称公钥加密保护一起传回去的。

不论哪种情况你都不需要保存私钥。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1051216

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX