最近思考了一个问题,手机端如何保存 client_secret 的最佳实践 ?
事情是这样的,经过了一年的业务升级迁移,node 做的 gateway 已经逐渐稳定,oauth2 也用 node 写了一个,为了搞明白原理而已。https://www.v2ex.com/t/731916
用户认证 是通过 gateway 的,为了避免用户直接拿到 token ,我把 token 放在了 session 里面,这样用户么有明文 token 来请求接口了。
现在突然想到,如果是手机端如何处理呢?如果是 用 OAuth2 会发送 client_secre 来换取 AT 。再通过 AT 来请求后端接口获取数据,看了几个 flutter 的例子,client_secret 都是本地储存,因为手机端我认为不被信任,因为可以通过各种手段来获取到 client_secret
搜到的资源如下 :
有个叫做 PKCE 的东西 OAuth2 协议的扩展版本是支持的,这里是产生动态随机码,跳过了 client_secret 要保存在客户端的问题。
但是如果授权服务器不支持 PKCE 的情况下有没有什么最佳实践呢 ?
1
dzdh 2022-07-25 14:51:52 +08:00
看了一下 PKCE 是防止被拦截请求。本质上仍然需要一个 CODE 在本地。否则你调用接口的凭据是什么呢。
|
2
qfdk OP @dzdh #1 code_verifier 是随机的,等于是 需要一个 code + code_verifier 来换取 token ,成本增加了一点点。
所以现在找个最佳实践来解惑,看到好多是保存在本地的例子 |
3
unco020511 2022-07-25 16:02:14 +08:00
你都 https 了,第三方怎么获取你的 token 呢?用户自身拿到 token(比如抓包)那很正常啊
|
5
xiangyuecn 2022-07-25 20:15:55 +08:00
严禁掩耳盗铃🐶
|
7
qfdk OP @xiangyuecn #5 啊啊啊啊,虽然很星象,但是也是我思考的问题 在 PKCE 出来之前那都是如何解决的呢
|
8
nyxsonsleep 2022-07-26 17:49:52 +08:00 1
没细看,不过你不像让用户不知道 token 是什么是不可能的。本地的东西怎么可能不让用户不知道数据是多少。
--- 看法是要么加盐,还要可逆。这样使得用户每次的 token 都会发生变化。s 端还能解密回来知道 token 真实值。再每隔一个周期重新生成 token 。 以上简称为“算法”,也就是 app 与 s 端通讯的签名。 事实上无论哪家的算法都有被破过,但是不是永远被破。 因为破解这玩意是有成本的,比如算法放在 so 里,手机里装 xp 然后慢慢 hook 。虚拟机 dump 吧。汇编慢慢看,这得花多少时间,你的 app 值这个时间吗? 谁有这个闲心每个版本都破一遍?换个算法对于作者什么成本,破解者什么成本? 《没有绝对安全的系统》 |
9
qfdk OP @nyxsonsleep #8 感谢回复,其实是这样的,我的业务对象是面相高校的,学校有专门的安全专业,在来之前他们的 token 是裸露的,导致很多学校拿着 token 进行“非法请求”、后来经过改进 加了谷歌验证码 还有 token 非直接留给客户端就少了很多 奇怪的请求。 我们手机业务是外包给第三方的,我在思考如果让我做一个手机 app 我应该如何处理。
您说的对没有绝对的安全,但是对于这些“闲”学生还是要斗智斗勇的。 |