前后端分离调用api接口加密方式

参考各方资料结合自己的理解写的此文,

可实现接口调用防抓包,防篡改,防重发攻击,

1.服务端配置一对RSA密钥对,公钥pubkey_server,私钥prikey_server,并将pubkey_server写到web端js中

2.web端打开登录页,生成一对RSA密钥对,公钥pubkey_client,私钥prikey_client

3.登陆操作:

  a.web端用pubkey_server加密如下信息,调用服务端登陆方法

  {

  loginname:'admin',

  password:'123456',

  pubkey_client:'这是pubkey_client'  

}

  b.服务端用prikey_server解密登陆参数,验证登陆信息,并把pubkey_client保存到服务端缓存

  c.服务端生成AES对称加密的key,用pubkey_client加密如下返回结果,返回登陆信息

{

token:'这是认证token',

aeskey:'这是动态生成的aes加密key',

status:'登陆成功'

}

c.web端收到登陆结果信息,用prikey_client解密,拿到token和服务端动态生成的aeskey

4.接口调用:

 a.用aeskey加密如下参数调用服务端api接口

{

token:'认证token',

param:'接口参数',

timestamp:'这是一个时间戳',

sign:'签名,对token,param,timestamp做md5运算得到的签名'

}

b.服务端收到web端参数,用对应的aeskey解密,

  然后做签名运算,校验是否被篡改,

  然后判断时间戳是否在1分钟之内,如果不是提示参数已经过期,

  如果是,则写入redis,过期时间1分钟,防止重发调用(拿请求参数判断redis里是否存在,如果存在则是重发的调用)





你可能感兴趣的:(web前端,java,算法,架构设计)