如何做到真正的服务端加密存储,仅用户客户端解密后使用?
我现在是弄一个小程序,用户会添加非常敏感的安全信息,目前是用户端添加敏感数据时使用他的union_id和固定的key作为加解密密钥,然后再AES加密后再提交到服务端,然后下次请求服务器返回加密数据后解密再使用。
这里存在一个问题,如果有黑客拿到了我的数据库,和我的算法,然后就可以解密出用户的敏感数据。因为用户union_id是会记录到服务端数据库,客户端固定的key也是可以扒到。
有什么方案可以做到真的的加密云端存储,除了用户自己,其他人完全无法解密数据呢,包括我自己也无法查看用户的敏感数据?
跪求各位大佬推荐一个方案
回复
1个回答

test
2024-06-26
楼上的回答没一个靠谱的。
最简单的办法,把用户的 union_id 或者 openid 当做加密的 key,当然也要做一些处理,例如做 md5 处理生成 32 位的 aes key 用于加密数据。
其次,服务器上不存储明文的 union_id,可做 hash 处理后存储数据库用于标识唯一用户。
这个方案相当于把安全问题丢给了第三方,也就是小程序这边。我考虑过使用登录态相关的字段来加密,例如 token 之类的,但每次登录都会导致 token 发生变化,所以不适用这个场景。
这样处理的好处是,黑客拿到服务器权限,也只能拿到 hash 处理后的数据,无法逆向拿到 union_id。坏处就是一旦 union_id 泄漏,则用户所有数据暴露。而且按照微信小程序的授权登录流程,access_toekn 泄漏的可能性还是比较大的。
所以这个方案还有进一步优化的空间,例如对 access_token 做加密存储,客户端也不直接存储 union_id,客户端和服务端之间的通信使用 curve25519 算法生成共享密钥用于加密双方传输的数据等等。
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容