环境:后台 ASP.NET Web API ,前端为 html,js(跨域访问)html
场景1:前端
客户端自保管RSA 公钥和密钥,签名为客户端私钥签名,服务端用客户端公钥进行签名验证跨域
场景2:安全
客户端使用SHA1签名(包含 AES_KEY)服务器
保证了数据传输过程当中,数据的绝对安全性,就算被黑客抓包获取他也机关用尽。加密
设计逻辑:spa
1. 从服务端获取 【服务端 RSA 公钥】设计
//客户端判断公钥是否受信任
//todo...3d
2. 用户登录htm
-- 随机生成【本地 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
客户端用本身的RSA私钥签名,服务端用客户端的公钥进行签名验证
若是是场景2,签名数据为 local_aes_key + "_" + token + "_" + timestamp + "_" + nonce + "_" + method_name + "_" + raw
(local_aes_key 只有服务端和客户端拥有,第三方无从得知,故其为关键因素)
返回数据:
因为配置为加密传输数据(接口方法参数、返回数据),故返回为 AES 加密数据的 HexStr,
须要客户端亲自使用【本地 AES KEY】解密获得真实数据。
...
跨域配置配置: