支付动态码,TOTP算法及luhn算法
文章目录
TOTP算法,Luhn 解析
Luhn算法简述
Luhn算法,一般用于验证身份识别码,比如国际移动设备辨识码(IMEI),商标识别码。它不是一种安全的加密hash函数,设计的目的只是防止意外出错而不是恶意攻击
通过校验码对一串数字进行验证,校验码通常会被加到这串数字的末尾处,从而得到一个完整的身份识别码
==78 19032121 3233 X==
1-2位:识别码,固定数字XX(2),区别于其他支付码,
比如微信10-15开头(18位长度),支付宝25-30开头(16-24位)
云闪付62开头(16-19位)
3-10位:TOTP算法,60秒刷新一次(8位)
11-14位:随机数四位,通过获取登录用户的随机数在缓存中校验
15-17位: 会员id十进制转八进制后截取最后三位,校验用户(3位)
18位:luhn算法,付款码正确性校验(1位)
Luhn算法
1 | public static char getCheckCode(String nonCheckCode) { |
TOTP算法:
基于时间戳算法的一次性密码,是时间同步,基于客户端的动态口令和动态口令验证服务器的时间比对,一般60秒 ,或者30,能够十分精确的保持正确的时钟,客户端和服务端基于时间计算的动态口令才能一致。
- 服务器登录动态密码验证
- 公司VPN登录双因素验证
- 银行转账动态密码
- 网银、网络游戏的实体动态口令牌
- 等基于时间有效性验证的应用场景
totp计算公式
1 | TOTP(K, TC) = Truncate(HMAC-SHA-1(K, TC)) |
k密匙串,TC是一个函数,用于截取加密后的字符串
TC计算公式
1 | TC = (T - T0) / T1 |
T ,当前时间戳,T0,起始时间,时间间隔,业务自定义
1 | /** |
1 | /** |
1 | private static byte[] hexStr2Bytes(String hex) { |
原文作者: fengqisheng
许可协议: CC BY-NC-SA 3.0
-------------本文结束感谢您的阅读-------------