环境:后台 ASP.NET Web API ,前端为 html,js(跨域访问)

 


 

 

场景1:

客户端自保管RSA 公钥和密钥,签名为客户端私钥签名,服务端用客户端公钥进行签名验证

 

场景2:

客户端使用SHA1签名(包含 AES_KEY)

 

 


 

 

设计逻辑:

1. 从服务端获取 【服务端 RSA 公钥】

//客户端判断公钥是否受信任
//todo…

 

2. 用户登陆

  – 随机生成【本地 AES_KEY 临时】

  – 用【服务端 RSA 公钥】加密敏感数据(【用户密码】、【本地 AES KEY 临时】)

  – 将登陆信息传送给服务端

 

登陆参数:

“user_id”: user_id,
“encrypted_password”: encrypted_password, — 使用服务端RSA公钥加密的数据,包含:用户密码、登陆时间戳、随机数
“encrypted_key”: encrypted_key      — 使用服务端RSA公钥加密的数据,包含:【本地 AES_KEY 临时】、登陆时间戳、随机数

 

说明:

由于用服务端RSA公钥加密,只有服务端的RSA私钥才能解密,

密码部分和本地随机的【本地 AES_KEY 临时】加密时进行了随机混淆,

并且服务端后台进行了时间戳检查(5分钟有效),这样就保证了登陆时的安全性。

 

登陆返回值:

token = obj.token; — token

timestamp = obj.timestamp; — 时间戳 用于客户端与服务端进行同步计数器,防止重放攻击

local_aes_key = AES_Decrypt(obj.aes_key, local_aes_key_first, local_aes_iv);  — 用客户端【本地 AES_KEY 临时】解密数据得到服务器生成给客户端的【本地 AES_KEY】,用于后期签名参数和数据加解密

enabled_data_encryption = obj.enabled_data_encryption; — 是否启用数据加解密

 

 

 

 

 

 

 3. 接口调用

接口参数:

“token”: token, 
“signature”: signature, — 签名
“timestamp”: timestamp,
“nonce”: nonce,
“method_name”: method_name, — 方法名(control_name+action_name)
“raw”: raw2 — 方法的参数

 

签名:

如果是场景1,签名数据为 token + “_” + timestamp + “_” + nonce + “_” + method_name + “_” + raw

 

如果是场景2,签名数据为 local_aes_key + “_” + token + “_” + timestamp + “_” + nonce + “_” + method_name + “_” + raw

 

 

 

 

 

 

返回数据:

由于配置为加密传输数据(接口方法参数、返回数据),故返回为 AES 加密数据的 HexStr,

需要客户端亲自使用【本地 AES KEY】解密得到真实数据。

 

 

 

 


 

 

 

以上讲的主要是前端的逻辑,后台逻辑下篇再续…

 

 

 

 

 


 

跨域配置配置:

版权声明:本文为wang_xy原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/wang_xy/p/8676913.html