如何在服务端安全存储Stripe secret key 调用时会被拦截吗?
核心问题结论
你说的「把密钥存在服务端、下发到客户端后再发起Stripe请求」的方案存在极高的泄露风险,完全不符合Stripe的安全规范。
Stripe secret key(以下简称SK)的安全原则是:永远不能出现在客户端环境,不管是硬编码、动态下发、还是临时放在客户端内存里都不行。
只要SK被发送到客户端,无论是HTTPS传输过程被恶意中间人抓包,还是客户端设备被root/越狱、被恶意程序dump内存,都可以直接获取到明文SK。你贴的代码里直接把SK放到请求头里向Stripe发送请求,这种场景下只要用户抓包就能直接看到完整的SK,相当于直接把密钥公开,恶意人员拿到SK后可以直接操作你的Stripe账户发起扣款、转账、退款等操作,风险极高。
适配Amplify GraphQL场景的正确实现流程
你要创建Payment Intent的需求,完全不需要把SK下发到客户端,按以下流程改造即可:
- 不要在客户端直接调用
https://api.stripe.com/v1/payment_intents接口 - 新增一个Amplify GraphQL的自定义Resolver,或者在你自己的服务端新增一个接口,专门处理Payment Intent的创建逻辑
- 所有携带SK调用Stripe接口的逻辑,都在Resolver/服务端内部完成,示例的服务端逻辑和你贴的代码结构一致,只是运行环境从客户端换成了你的可信后端:
// 这段代码仅允许在你的服务端/Amplify Resolver中运行,绝对不能出现在客户端代码里 var response = await http.post(Uri.parse('https://api.stripe.com/v1/payment_intents'), body: body, headers: { 'Authorization': 'Bearer sk_test_51JtrW7EI6WXcFFnPxSxwCIm24D8Gjj3e6hzxch4009kFOsXo7', 'Content-Type': 'application/x-www-form-urlencoded' });
- 服务端/Resolver拿到Stripe返回的结果后,仅需要把
client_secret字段返回给客户端即可,客户端后续仅需要用这个client_secret完成支付确认流程,不需要再用到SK。 client_secret本身的权限仅针对对应单条Payment Intent,就算被拦截也不会造成全局密钥泄露,也无法操作你账户内的其他资源,符合安全要求。
内容的提问来源于stack exchange,提问作者user3697484
相关产品推荐
相关产品推荐

