回答

收藏

三方接口签名验签简易设计与实现

知识点 知识点 70 人阅读 | 0 人回复 | 2022-06-12

本人水平有限,对密码学的理解相当浅显。错误与疏漏,欢迎各位指正。
' j; N3 O& A5 I6 g: [. [
〇、写在前面  G' P6 S' \0 ~) p# u4 h
# I6 [1 ?2 R+ u
    : b+ }* V  F3 m9 q9 s9 A; a
  • 接口安全防护是个永恒的话题,提供给前端的接口需要登录,提供给服务的接口(下文简称"三方接口")也需要鉴权;+ Z& q) x8 w& j+ q# T# |# y* W
  • 当前大环境下,http restful(甚至不restful)盛行,因为简单。性能上,额...至少比soap webservice好;5 h" z( S3 J1 o$ _& e4 W! M0 W
  • 对于三方接口鉴权,规范的协议有不少,比如OAUTH2, 但完整的OAUTH2协议对客户端有着苛刻的要求,阉割的OAUTH2协议看起来好像没啥用(我个人这么觉得);) V2 l" Y) C/ o
  • 除了鉴权,还有一个难点是防劫持。如果被劫持了,包括鉴权在内的所有请求都不再可信;+ _8 b- Y) @; L* @
  • 防劫持的唯一可靠措施似乎是https,然而总有一些网站没有https,包括一些从来不会被攻击,但是天天报漏洞需要修复的头疼系统;
    9 v$ n2 c& @& u0 b. {
  • 即使如此,也不能破罐子破摔,多加点防护,提升点攻击成本,至少一眼看起来没啥问题。这样就差不多了。5 ?# Y+ z4 u. P  |& s- i% a5 v
一、整体设计6 ]9 v$ t4 s0 M
  X4 p1 U0 L, u, P
1.1 大体思路7 y3 u! A3 Q; s' W2 G/ Q' U5 _9 x
# s+ W' |8 @5 e* \+ U$ J9 ?; R( J; Y
    3 B0 p) d: e1 v. C6 T0 W) i
  • 服务端维护客户服务列表,仅提供服务给已知的客户端;5 J9 b' P; y/ [, w' U) j
  • 客户端持有两个密钥, 一个是对称加密的密钥,一个是非对称加密的公钥,两个密钥同时泄露请打110. 客户端发出请求前,使用公钥加密少量信息(例如客户端标识等),使用对称密钥加密请求体,最后使用加密后的请求体加盐(例如两个密钥组合起来)生成摘要,签名由非对称加密后的字符串拼接摘要组成" w1 E( w* _( B( f5 g% `8 W1 f
  • 服务端接收到请求后,查询客户服务列表获取密钥等信息,对比摘要后,私钥解密对比签名的剩余部分,最后对称解密。
    3 l: s2 d5 i7 Y' _! }+ J& D
1.2 详细设计) o* K9 X7 ?) ]

% H, x" ]8 }$ K! `1.2.1 服务属性
) r* J; L5 J2 k# \" L+ j7 J. G, H& b$ A  U7 ~
属性名称中文释义备注clientId服务唯一标识clientSecret对称密钥privateKeyServer服务端私钥仅服务端持有publicKeyServer服务端公钥1.2.2 客户端处理流程7 N6 p! [' c2 I, G! B7 i2 @

7 k  }! i$ c) i. K+ A. S程序参与方:  @+ F' q" h9 F- B# C1 E' [

    3 D; Z, `0 n0 k  R1 b4 X& u0 \
  • Invoker: 调用者,即程序引用方;/ @' s6 i8 U# Q. t& ?
  • RpcEncrypt: 程序入口;; Q! e9 u/ p0 ]0 z- f5 m
  • Signature: 签名接口,客户端签名和服务端验签等逻辑在这里实现;4 J  g+ k. Q1 D7 t
  • Digest: 摘要接口,默认实现为HMAC;
    9 B9 x# n5 ?4 _1 k' w
  • Asymmetric: 非对称加密接口,默认实现为RSA;
    + X- J: b3 m6 E7 [2 v
  • Symmetric: 对称加密接口,默认实现为AES;0 u1 l% k4 w2 o4 D* g
  • Storage: 存储接口,默认实现为内存。
    9 Z' a1 p3 }( N+ p
1.2.3 服务端端处理流程
' _, ~' g# o2 J2 \1 U
; }& A, O9 y. k4 K( Y  `
1.2.4 程序设计
8 l, y/ @% p$ O: z9 n7 N- N# J
6 a; y' D- n# U" ^2 q; f
二、代码实现
+ r3 {7 A$ l2 @/ J6 e3 k6 T. c! m1 D5 @4 L" E4 S+ k

) z, b& p1 c3 N& {5 U3 F  C9 |, J2 V5 nJava吧(Java8.com)后续还会分享更多java技术文章、资源,希望大家以后多多支持Java吧 www.java8.com
分享到:
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

346 积分
54 主题
热门推荐