前后端国密加密传输用户密码流程
一、国密算法介绍
SM2:非对称加密,由公钥和私钥组成,公钥可以公开,私钥不允许公开,公钥的加密结果只有私钥能够解开,公钥加密相同内容,每次加密结果不同。
SM3:哈希算法,相同的内容哈希算法结果相同。
SM4:对称加密,使用一个密钥对原文进行加密,对密文进行解密。
二、工作流程
服务端与客户端使用一对SM2密钥,建议SM2公钥通过调用服务端接口获取,不要硬编码在客户端。
这里用保存用户密码流程举例:
- 客户端请求服务端生成随机数,服务端保存该随机数
服务端随机数作为server_nonce,nonce是指一个仅使用一次的随机数或令牌,用于确保某次通信或交易的唯一性,防止恶意用户重复使用有效请求,比如攻击者拦截登陆请求,虽然无法解密请求内容,但是可以将请求信息重复发送,模拟用户登陆,如果请求中只包含用户密码而不包含server_nonce,会导致攻击者成功登陆的安全风险。
- 客户端生成客户端随机数,与服务端随机数按指定规则成SM4秘钥。
引入客户端随机数使最终的对称密钥由两端共同贡献(server_nonce + client_nonce),这样即使有人知道server_nonce,没有客户端随机数也无法推导出会话密钥,增加抗重放与密钥不可预测性。
- 客户端使用SM4秘钥加密原文,得到国密加密结果,SM4密钥由服务端随机数与客户端随机数生成,所以每次密钥不同,每次加密结果不同。
- 客户端使用SM2公钥加密客户端随机数。
使客户端随机数在传输中被保护,只有持有 SM2 私钥的服务器可以恢复 client_nonce。这样即便攻击者截获了客户端随机数密文,也无法得到 client_nonce,从而无法派生出 SM4 密钥解密密码密文。
- 客户端将SM4加密的密码与SM2加密的客户端随机数一起发送给服务端。
把加密后的密码与加密的客户端随机数组合发送,服务端能安全获得 client_nonce(解密 SM2),进而和已存 server_nonce 共同派生 SM4 密钥并解密密码。
- 服务端使用SM2私钥解密SM2公钥加密的客户端随机数,得到客户端随机数,与保存的服务端随机数共同生成SM4秘钥。
- 服务端使用SM4秘钥解密加密结果,得到原始密码。
- 服务端使用SM3对原始密码进行哈希运算,保存到数据库。