客户端签名密钥如何存储才能保证安全?

261 天前
 szandy6

客户端请求 API 时,一般要带上签名信息,签名参数用的密钥( secret key)怎么存储才能保证安全,还是说有其他更好的方案,比如放在服务端,大家一般是怎么做的。

1422 次点击
所在节点    问与答
30 条回复
dzdh
261 天前
webauthn ?
EchoAI
261 天前
我们目前是这么做的:Android 使用 so 文件,iOS 使用 a 文件,web 使用 wasm 文件。密钥和算法都在内部实现,同时做了很多防反编译的策略。
szandy6
261 天前
@EchoAI 我们之前也是这么干的,不过安全部门说会被反编译出来。
EchoAI
261 天前
只要是密钥需要存储在客户端,就会被拿出来。只是时间的问题。绝对的安全是不存在的。
szandy6
261 天前
@EchoAI 是的,能做的就是提高一点破解的复杂度,没有绝对安全。
tool2d
261 天前
我看到过的版本是密钥和时间强相关,客户端 6 小时就会变动一次,用算法生成的。

要破解密钥容易,要拿到算法还是有一点难度的。
0o0O0o0O0o
261 天前
先说观点:放在客户端的全部都是能够被公开的东西。

> 安全部门说会被反编译出来

一些白盒密码方案大约就是为了应付这种情况,说是应付,因为它们和 #2 在一部分攻击者看来没有太多本质区别。
xiangyuecn
261 天前
http 时代的遗留产物。
yinmin
261 天前
一了百了的方案是改成不对称加密。客户端保存 rsa 公钥(是公开的,没必要保密),客户端用 rsa 公钥加密数据后上传,服务器用 rsa 用私钥解密。

直接从理论上解决问题。
edwardhodges
261 天前
客户端不要直接请求这个 API 。客户端请求自己的业务服务器,然后服务器来请求这个 API ,密钥放在服务器就好了。
tool2d
261 天前
@yinmin 不行哦,客户端能用 rsa 公钥加密,那么黑客也能用 rsa 公钥加密。

服务器收到后,都能解密。分不清哪个是黑客签名,哪个是真客户端签名。
mdn
261 天前
@edwardhodges 业务服务器如何分辨是自己的客户端了
hsfzxjy
261 天前
放在系统原生的钥匙串应该安全吧?比如安卓的 https://developer.android.com/reference/android/security/KeyChain
szandy6
261 天前
@yinmin HMAC 与加密需求不一样,如果是数据加密,现在非对称加密是比较成熟的方案。
SteveRogers
261 天前
密钥本地二次加密、二加密后的密钥分开存储,然后放到多处。
xiaoke
261 天前
搭车请教,看到一些安卓 APP 直接把证书文件放在 assets 目录下,有风险吗?
0o0O0o0O0o
261 天前
@tool2d #11 你说的这是客户端软件层面 **无解** 的事情(包括白盒),客户端的所有混淆都可以被分析所有逻辑都可以被模拟,只是难易度的区别。

> 分不清哪个是黑客签名,哪个是真客户端签名

这对应的应该是一个完整的风控系统,而不单纯是客户端该考虑的
iX8NEGGn
261 天前
你没搞明白,国内大厂的 api 签名是为了防止重放攻击,参与签名的参数一般都包含时间,你这个属于 SSL Pinning ,为了提升绕过客户端请求的难度,破解是避免不了的,只是增加破解难度而已。
rocmax
261 天前
一般应用加密只是为了防止篡改请求。如果你的应用真的需要用签名核实身份(例如比特币钱包类),请使用 HSM 。如果是手机应用的话内置加密模块有类似功能,可以保证密钥不离开硬件。
edwardhodges
261 天前
@mdn 已经是业务服务器了,那就可以设置自己的登录等业务了。登录后获取 token ,用 token 来做校验不是常规操作?

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

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

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

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

© 2021 V2EX