桌面应用中的第三方 key 和 secret 是不是理论上无法杜绝被破解?

查看 98|回复 11
作者:AoEiuV020JP   
最近在学 flutter ,想试试使用 google api ,
刚知道桌面应用是没法像安卓这样验证包名签名啥的确认是开发者自己的应用在使用 api ,
谷歌凭据有提供安卓,ios ,web ,uwp 等多种应用可以针对性设使用限制,
但除此之外的平台就没法限制了,
理论上是不是不管客户端怎么隐藏 secret, 不添加到 git 中,不写硬编码在代码里,
只要还是客户端请求 api ,破解者只要能在 google api 初始化的代码拦截一下参数获取到 secret ,就可以拿走随便用了?


AoEiuV020JP
OP
  
总觉得好些安全性建议都是脱裤子放屁,
比如这个谷歌地图安卓 api key ,谷歌建议是不要写在代码里,不要提交到 git 里,为此谷歌特地做了个插件方便从 git 忽略的 local.properties 文件读取 api key,
可问题是 api key 最终还是要填充到 manifest 里,这个拿到 apk 直接就能看到啊,能保护 key 的只有设置签名指纹限制,这 key 是否随代码公开真有区别吗?
AoEiuV020JP
OP
  


yekern   
动态加密啊, 启动 App 的时候从网络获取加密后的 key 和 secret, 用证书或者 其他方式对应解密, 除非你的源代码被爆 ,用户用同样的方式解密,这个就是一个长期对抗的过程了 你不停的换加密算法 对方不停的破解算法
AoEiuV020JP
OP
  
@yekern #3 我想说的就是不管怎么获取,怎么加密,只要是在客户端调用,最终都是要按第三方要求的方式传递进去,
比如 google oauth 桌面应用一定要调接口 https://oauth2.googleapis.com/token, 接口参数就有 id 和 secret ,
前面怎么获取怎么加密都无所谓,只要抓到这个接口参数,secret 就暴露了, 暴露了再换加密都没用了,
我在想这些 secret 是不是压根就不重要,直接写死就好,
或者压根就不该在客户端调用,但现实中感觉不少见客户端直接请求第三方 api 的,给人感觉好像是个常规做法,
我本以为会像安卓一样可以有签名之类限制,结果并没有,完全不设防,
vczyh   
oauth 设计 secret 的东西应该放在服务端吧,比如通过 secret 获取用户信息这样的 API 。
b821025551b   
oauth 的规范是前端不存 secret ,而是向自己的后端拉取根据 secret 生成的 token ,后续前端用 token 进行操作。
AoEiuV020JP
OP
  
@vczyh #5 确实看这情况应该只能这样了的,
但我想开发个没有服务器的纯客户端应用就很尴尬,关键是安卓可以设置密钥使用限制,做跨平台 app 各端区别对待就不大爽了,
oauth 只是个例子,还有别的比如地图什么的,就更难把 key 隐藏在服务器上了,
ysc3839   
那显然是没办法的,请求内容的计算生成都是在设备上进行的,你的代码没保密,数据也没保密,那别人自然也可以生成。
Android 那个验证包名签名是依赖 GMS 的吧?不依赖外部应用也是没办法的。
AoEiuV020JP
OP
  
@ysc3839 #8 可现实是真的很多把 key 放在客户端使用的,让人感觉是常规做法, 我公司桌面版就是这样,
安卓那个不是依赖外部,比如谷歌地图 key 能限制包名签名,百度地图 key 也行, 几乎所有主流第三方库都有这功能,
原理大概是相关校验混淆加密放在 so 里,大厂保证 sdk 的破解难度,光破解 app 本身得到 key 也无法使用 key ,
但桌面端就真没办法了,api 都是公开的,key 的使用也没法校验什么,只能祈祷没人偷 key ,
感觉,就挺意外的,我本以为安卓这种自签名的机制已经是安全性较低的了,结果桌面端居然默认程序是无签名的,
按理说二进制程序也是可以有数字签名的,但好像各方都没有在意这个签名,都当作不需要签名,
您需要登录后才可以回帖 登录 | 立即注册

返回顶部