互联网金融系统实现之数据平台交互验证方式
H5调用数据平台验证授信项
String requestIdRes = restTemplate.postForObject(url, null, String.class);LOGGER.info("getRequestIdUrl res {}", requestIdRes);String requestId = JSONObject.parseObject(requestIdRes).getString("data");HashMap<String, Object> map = new HashMap<>();map.put("applyNo", requestId);map.put("cardId", CommonUtils.decrypt(userIdnoInfo.getIdNo()));map.put("mobile", CommonUtils.decrypt(user.getMobile()));map.put("userName", userIdnoInfo.getName());map.put("token", System.currentTimeMillis());map.put("accessToken", MD5Utils.getMD5String(UrlConfig.JWT_SECRET + map.get("token")));JSONObject jsonObject = new JSONObject();jsonObject.put("custId", user.getToken());map.put("relationalParam", jsonObject.toJSONString());map.put("color", "blue");StringBuilder sb = new StringBuilder();sb.append(mobileSuccessdirectUrl).append("/").append(requestId).append("/").append(user.getToken());map.put("successDirectUrl", sb.toString());LOGGER.info("mobileValid map:{} ", map.toString());String token = JwtUtils.sign(map);StringBuilder resUrl = new StringBuilder();resUrl.append(UrlConfig.MobileCrawler.MOBILE_H5_URL).append("?color=blue&corpId=").append(requestId.substring(0, 3)).append("&token=").append(token);
* 进件号从风控获取,requestid
*accessToken 是密钥和当前时间戳进行md5加密
*JwtUtils是封装的工具栏,具体代码下面有,主要把通用参数放入map
所有参数放入map后,利用jwt把map生产token,发送给数据平台,其实数据平台需要的只是下面几个:
String token = JwtUtils.sign(map); StringBuilder resUrl = new StringBuilder(); resUrl.append(UrlConfig.MobileCrawler.MOBILE_H5_URL).append("?color=blue&corpId=").append(requestId.substring(0, 3)).append("&token=").append(token);
回头看看数据平台文档:
加密方式
我们会分配一个渠道号(corpId,比如301),每个渠道就相当于一个商户,有自己corpSecret,即密钥,调用的所有步骤都需要加上corpId、token以及accessToken这个参数,accessToken是md5(corpSecret + token)
corpId | string | 是 | 由我们分配 | 是 |
token | string | 兼容现在的token(即当前毫秒值) | 是 | |
accessToken | string |
md5(corpSecret + token) corpSecret跟corpId一起由我们分配 |
是 | |
applyNo | string | 进件号,如果该参数有值,则最终的返回值为该参数。 |
serviceType | string | 是 |
服务类型,比如手机、淘宝等()
credit_card 信用卡 mobile 手机运营商 alipay 支付宝 credit_report 征信报告 taobao 淘宝 bank_card 银行卡 jingdong 京东 insurance 社保 fund 公积金 bank_credit 网银信用卡 sdk_device_info sdk设备基本信息 sdk_location_info sdk设备地理位置信息 sdk_contact_info sdk设备通讯录信息 sdk_gsm_info sdk设备通话记录信息 sdk_sms_info sdk设备短信记录信息 sdk_info sdk信息(此种类型只针对第三方推送的信息,比如融360推送的信息) |
|
serviceProvider | string | 是 | 服务提供方 KingChan,魔蝎等 | |
interfaceType | string | 是 | 接口方式 api, h5 | |
cardId | string | 进件人身份证号 | ||
mobile | string | 进件人手机号 | ||
userName | string | 进件人姓名 | ||
relationalParam | string | 是 |
关联参数 json串,格式如下: { "custId":"111","other":"The other infomation"} custId 在调用方系统中的用户id varchar(64) other 在调用方系统中的用户其它信息 varchar(256) 我们会把最终返回的进件号与该参数做绑定,最后在回调的时候一并推给调用方,好让调用方知道是他们系统哪个用户的数据 |
public class JwtUtils {static String secret = UrlConfig.JWT_SECRET; // 默认私钥,各个渠道会在联调时分配static Algorithm algorithm = Algorithm.HS256;private JwtUtils() {}/*** 加密* * @return*/public static String sign(Map<String, Object> params) {Options opt = new Options();opt.setAlgorithm(algorithm);long iat = System.currentTimeMillis() / 1000L; // 生成时间,秒long exp = iat + 600L; // 失效时间JWTSigner signer = new JWTSigner(secret);HashMap<String, Object> claims = new HashMap<>();claims.put("iss", "datapi");claims.put("exp", exp);claims.put("iat", iat);for (Entry<String, Object> entry : params.entrySet()) {claims.put(entry.getKey(), entry.getValue());}return signer.sign(claims, opt);}
}
1. jwt加密,加密的输入参数
密钥(服务方指定),待加密的内容,指定加密算法为HS256
Options opt = new Options();opt.setAlgorithm(algorithm);long iat = System.currentTimeMillis() / 1000L; // 生成时间,秒 long exp = iat + 600L; // 失效时间 JWTSigner signer = new JWTSigner(secret);HashMap<String, Object> claims = new HashMap<>();claims.put("iss", "datapi");claims.put("exp", exp);claims.put("iat", iat);for (Entry<String, Object> entry : params.entrySet()) {claims.put(entry.getKey(), entry.getValue());}return signer.sign(claims, opt); }
2.服务方收到后用公钥解密,读取加密的消息体
解密JWT
第一段落从实际应用展示了如果应用jwt。下面我们从理论学习一下jwt
什么是jwt
简单来说jwt就是一个string串,格式如下:
header.payload.signature
jwt原理
header:
{ | |
"typ": "JWT", | |
"alg": "HS256" | |
} |
payloader
{ | |
"userId": "b08f86af-35da-48f2-8fab-cef3904660bd" | |
} |
可以放很多属性,包括iss发行者,sub主题,exp失效时间。
签名
利用头部alg指定的算法对header和payload进行加密,生成
data = base64urlEncode( header ) + “.” + base64urlEncode( payload )
signature = Hash( data, secret );
jwt应用场景
认证而非加密
jwt不足
安全性不足,一般用https
jwt验证
package com.xt.tutorial.utils;import java.util.HashMap;
import java.util.Map;import com.auth0.jwt.JWTSigner;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.internal.com.fasterxml.jackson.databind.ObjectMapper;public class JWT {private static final String SECRET = "XX#$%()(#*!()!KL<><MQLMNQNQJQK sdfkjsdrow32234545fdf>?N<:{LWPW";private static final String EXP = "exp";private static final String PAYLOAD = "payload";/*** get jwt String of object* @param object* the POJO object* @param maxAge* the milliseconds of life time* @return the jwt token*/public static <T> String sign(T object, long maxAge) {try {final JWTSigner signer = new JWTSigner(SECRET);final Map<String, Object> claims = new HashMap<String, Object>();ObjectMapper mapper = new ObjectMapper();String jsonString = mapper.writeValueAsString(object);claims.put(PAYLOAD, jsonString);claims.put(EXP, System.currentTimeMillis() + maxAge);return signer.sign(claims);} catch(Exception e) {return null;}}/*** get the object of jwt if not expired* @param jwt* @return POJO object*/public static<T> T unsign(String jwt, Class<T> classT) {final JWTVerifier verifier = new JWTVerifier(SECRET);try {final Map<String,Object> claims= verifier.verify(jwt);if (claims.containsKey(EXP) && claims.containsKey(PAYLOAD)) {long exp = (Long)claims.get(EXP);long currentTimeMillis = System.currentTimeMillis();if (exp > currentTimeMillis) {String json = (String)claims.get(PAYLOAD);ObjectMapper objectMapper = new ObjectMapper();return objectMapper.readValue(json, classT);}}return null;} catch (Exception e) {return null;}}
}
互联网金融系统实现之数据平台交互验证方式相关推荐
- 互联网金融售前心得数据脱敏分析 | PMCAFF微分享
本期主题 | 互联网金融售前心得&数据脱敏分析 分享嘉宾 | Gina 文字整理 | Mayi-天享 入群请联系管理员37°C微信号:erhuoyimei Gina 本期嘉 ...
- 史海峰:构建产业互联网金融系统的正确姿势
史海峰 IT民工闲话 读完需要 12 分钟 速读仅需 5 分钟 引言 互联网下半场从 ToC 进入 ToB 阶段,玩法不再是烧钱拉流量转化变现,而是深入产业核心领域,通过技术提升生态链整合能力,优化生 ...
- 互联网金融风控中的数据科学
内容来源:2016年12月16日,宜人贷数据部数据科学家王婷在"GIAC全球互联网架构大会"进行<互联网金融风控中的数据科学>演讲分享.IT大咖说作为独家视频合作方,经 ...
- 互联网金融系统——交易防重设计实战
为什么需要防范重复提交呢?举个最直接的栗子:你在商城里买了7888元的iphone x,付款后页面卡顿导致你重复点击了付款按钮,这时候如果后端不加重复交易验证的话,相当于付款15766元买了Iphon ...
- 【源码】ThingSpeak支撑工具箱:与物联网数据平台交互的工具
ThingSpeak是由MathWorks托管的免费Web服务,允许您收集.分析和处理各种传感器数据,并开发相应的物联网应用程序.ThingSpeak支撑工具箱可以让您使用MATLAB来读取数据中,并 ...
- 【解决方案】互联网直播系统RTMP推流网关平台EasyRTMPlive在幼儿园家长直播中的应用
校园.幼儿园安全越来越受到重视的情况下,我们可以看到市面上出现了越来越多关于视频监控解决方案,但是很多平台都有不同的原因,导致用户使用困难,比如价格昂贵.部署困难.推流效果不理想等.为了解决行业这一难 ...
- linux服务器登录次数,Linux 服务器和Windows服务器 用户登录失败次数限制【互联网金融系统漏洞排查】...
1.Linux服务器用户登录失败次数限制(使用pam模块实现) /etc/pam.d/sshd (远程ssh) /etc/pam.d/login (终端) 1.1.用户通过ssh登录失败次 ...
- hybris导出系统已有数据的两种方式
参考SAP帮助文档: https://help.sap.com/viewer/d0224eca81e249cb821f2cdf45a82ace/1905/en-US/a8beb8ac6b684228a ...
- 基于python的爬虫系统金融数据_基于Python的互联网金融数据采集
基于Python的互联网金融数据采集 □文/王 蕾1安英博1刘佳杰2 [提要] 互联网金融数据中潜藏着未知的知识价值,但也存在着巨量的数据冗余.通过Python可以进行互联网金融数据的获取.解析.提取 ...
最新文章
- AOP||动态代理||AOP专业术语;
- Matplotlib实例教程(十四)误差条形图
- OpenYurt 如何 “0 侵入” 攻破云边融合难点
- 2021年中国物流地产行业发展报告
- java虚拟机:虚拟机栈
- 读书笔记-----Oracle字符处理函数列表
- 华为计算机网络技术试题,(完整版)华为试题答案
- 计算机网络(第六版)
- SQL 事务(Tran | Transation)与 Try...Catch 的使用
- eclipse使用maven新建类目录时,提示The folder is already a source folder
- php euc-cn,php配置中文解说
- 哈尔滨工业大学邮件系统客户端设置
- 股票精灵接口的脚本策划
- 笔记本连WiFi共享网络给台式机 Ubuntu
- [安装fastfds中的nginx执行make命令报错]src/core/ngx_murmurhash.c:37:11: error
- java_重写hashCode
- FPGA到底是什么?
- 朱有鹏嵌入式免费课程
- 淘东电商项目(35) -SSO单点登录(登录功能完善)
- 【此后无良辰】实验二 CPU部件实现之ALU和寄存器堆
热门文章
- Android Qcom USB Driver学习(六)
- 什么是安时数(AH)
- SCI论文从入门到精通——IEEE论文那些事儿
- 老夫带你深度剖析Redisson实现分布式锁的原理
- 你真的理解C语言的灵魂 “ 指针 ” 吗?(初阶篇)
- Manifest merger failed with multiple errors, see logs问题处理
- python爬取某壁纸网站壁纸
- 华为p30应用软件开启速度测试,华为P30Pro速度测试,与iPhoneXS Max的差距,果粉无法淡定了!...
- 数据库云管平台 zCloud v3.5发布,智能化和国产数据库支持能力再增强
- crh寄存器_STM32的GPIO的寄存器介绍和设置