日常用到的 ak 和 sk 的正确使用方式是什么? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dandankele
V2EX    信息安全

日常用到的 ak 和 sk 的正确使用方式是什么?

  •  
  •   dandankele 2020-11-02 17:46:12 +08:00 4917 次点击
    这是一个创建于 1878 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在开发一个系统,需要提供 openAPI 给外部系统使用,那么 API 肯定需要设计一些认证、鉴权的流程。根据以往使用的一些公有云 API 以及微信 API 等来看,大多数平台都会给使用者提供 ak 和 sk 来调用 API 。

    这里的 ak/sk 可能有的也会设计为 appId/appSecret 之类的,像阿里云的是 accessKeyId 和 accessKeySecret 。

    我目前的看到和理解的有这么几种:

    1. 不传输 secret,调用 API 时,只传递 ak 和必要的数据。像阿里云 API,sk 是用作对称加密并进行消息签名,但我比较好奇的是,都说非对称加密安全性要高一些,为啥阿里云却选择了对称加密?

    2. 传输 secret,像 OAuth2 授权,在去获取 code 时,ak 和 sk 都要传递过去,那传递过程中不怕被截获吗?

    所以疑问是:sk 的作用到底是什么?是仅仅像帐号密码中的“密码”一样,在调用 API 时传递过去进行认证?还是用于对传输的数据进行消息签名,以便服务端判断是否有数据篡改?或者还有其他作用?

    第 1 条附言    2020-11-03 10:00:19 +08:00
    额,OAuth2 部分我看错了,获得 code 时的确不需要传 sk,code 换 token 时才需要传 sk,而且是在服务端传
    8 条回复    2020-11-03 09:00:50 +08:00
    boris93
        1
    boris93  
       2020-11-02 19:38:51 +08:00 via Android
    传输期间用 HTTPS 就不怕被截获了吧
    boris93
        2
    boris93  
       2020-11-02 19:41:47 +08:00 via Android
    ak 和 sk 可以作为一个密钥对用来认证
    比如一种常见做法就是 ak + : + sk,然后把字符串 Base64,然后拿去做 HTTP Basic 认证

    签名我理解更偏向于防止伪造和重放请求,签名里的 sk 作为密钥别人不知道也不应该知道,签名里的时间戳则保证了请求的时效性
    guyskk0x0
        3
    guyskk0x0  
       2020-11-02 19:45:50 +08:00 via Android
    个人看法:
    和系统安全等级有关,一般用 hmac 对消息签名可以达到鉴权+防篡改,消息内带时间戳可以校验有效期,整个流程不需要传输秘钥。公网流量套上 HTTPS 。

    安全性要求很高,可以做端到端 HTTPS 双向认证,也就是非对称加密。
    lotmany
        4
    lotmany  
       2020-11-02 21:07:04 +08:00 via iPhone
    有的 sk 二次获取的时候是需要检验密码的。
    如果接口也传了个 sk,可能是为了进一步保证安全吧(如果 ak 泄漏的话)。
    mrchi
        5
    mrchi  
       2020-11-02 21:37:34 +08:00
    不传输 secret,调用 API 时,只传递 ak 和必要的数据。像阿里云 API,sk 是用作对称加密并进行消息签名,但我比较好奇的是,都说非对称加密安全性要高一些,为啥阿里云却选择了对称加密?
    ---
    没用过阿里云的 API,通常用 ak 和 sk 做验证的 API,是只传 ak,用 sk 给消息体算签名(哈希算法),这样如果有中间人截获消息,没有 sk 没法算出正确的签名(哈希值),同时在消息体中包含时间戳防止重放攻击。

    传输 secret,像 OAuth2 授权,在去获取 code 时,ak 和 sk 都要传递过去,那传递过程中不被截获吗?
    ---
    如果中间人能够截获请求和响应,不管在不在请求里传 sk,只要拿到响应里的 access_token 就万事大吉了。就有了用户身份。

    我的理解是,前者的响应是资源,保护的是用户身份。后者的响应就是用户身份,所以传不传的无所谓。
    eason1874
        6
    eason1874  
       2020-11-02 22:05:04 +08:00   1
    ak 相当于账号,可以公开,一般直接透传; sk 相当于密码,要严格保密,一般只作为计算签名的参数。

    个别场景可能允许 sk 透传,但这个场景一定是发生在服务端,比如 OAuth2 获取 Access Token 就透传 sk 。你说的获取 Authorization Code 环节发生在客户端,那时不传 sk 只传 ak 。

    非对称加密效率低,主要用途是在不可信的网络环境中建立双方可信的通信来传递密钥,传递密钥之后一般还是用回对称加密来传递信息的,比如 HTTPS 就是这样。

    开发者跟开放平台之间用不着在不可信的环境中传递密钥,所以直接用对称加密就行了。
    ZeoKarl
        7
    ZeoKarl  
       2020-11-02 22:11:42 +08:00 via iPhone
    阿里云的 sk 可以拿来计算签名的,只要有 ak 和签名就行了
    xuanbg
        8
    xuanbg  
       2020-11-03 09:00:50 +08:00
    ak 是 key,sk 其实是 value 。调用者用 sk 加密数据,并把 ak 一起传过去。服务端用 ak 查询对应的 sk 解密数据。就是这样
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4015 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 05:18 PVG 13:18 LAX 21:18 JFK 00:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86