来自  资质荣誉 2019-09-24 17:22 的文章
当前位置: 澳门太阳娱乐手机登录 > 资质荣誉 > 正文

远程访谈API设计,key生成6位验证码

出于集团服务器启用了双因子认证,登入时须求再行输入谷歌(Google)地点验证器生成的验证码。而生成验证码是依据固定的算法的,以近年来时光为根基,基于每种人的google key去生成二个6位的验证码。也正是说,只假使这几个key,只要处于当前以此时刻,生成的自然是那6位数字。

Blog:<a href=";

以下为python3实现

要是启用HTTPS,基本上就不要思考传输的平安难题,只必要思虑身份认证难题

import hmacimport base64import structimport hashlibimport timedef cal_google_code(secret_key):    duration_input = int(time.time//30    key = base64.b32decode(secret_key)  # Length of the key must be a multiplier of eight    msg = struct.pack(">Q", duration_input)    google_code = hmac.new(key, msg, hashlib.sha1).digest()    o = google_code[19] & 15    google_code = str((struct.unpack(">I", google_code[o:o+4])[0] & 0x7fffffff) % 1000000)    if len(google_code) == 5:  # Only if length of the code is 5, a zero will be added at the beginning of the code.        google_code = '0' + google_code    return google_code

一、伊始在此之前

在平常的行事中,常常会遇见跟第三方系统做集成的急需,常用的手艺手腕有webservice,将来要给我们分享的是如何布置贰个有惊无险的可供远程访谈API。
提供两种调用格局:
1.前端ajax调用(当然前提是缓和了跨域难点)
2.后端发起HTTP乞请调用

这段算法有八个要点。

二、全部结构

图片 1

RemoteAPI1.jpg

率先算法对google key的长度是有要求的,key的尺寸必需是8的翻番。所以只要运维给的key不符合须求,供给在末端补上相应个数的"="。

简轻易单表明

  • 劳务器端提要求须求端key与secret密钥,这里能够追加IP过滤,要是带上key央浼的乞求端IP跟服务器上配置的IP不切合则赶回401
  • 央求端获得key与secret密钥后,发起呼吁时,直接把key放到header中,然后用数码摘要算法(如md5,sha512)对诉求数据变化数字具名sign(其实便是叁个字符串),一同放到header中
  • 服务器端的第贰个过滤器首先过滤远程API(可以虚拟远程API都用api/前缀打头),在此处首先验证key在系统中有未有,可选验证IP;借使待用sign,则表示带诉求数据,这年用服务器存着的secret对数码实行数字具名,与客户端传过来的展开自己检查自纠(防数据篡改),一切都通过后再把那一个key对应的user放session上
  • 得手通过session登入验证过滤器
  • UCRUISERL ACL权限验证过滤器一般是调控哪个人、剧中人物、群组能访谈这几个UPRADOL
  • 全部权限验证通过后到action-service顺遂取到多少并回到

总的看,远程API访谈在于开两个交代HTTP乞请交互数据,宗目的在于于权限的控制

其次,依据此算法,生成的验证码未必是6位,注意要在后面补0。

三、安全规划

防篡改

防篡改的情趣为严防数据在网络传输进程中被恶心篡改,例如在客商端-服务器端之间有个代理服务器(顾客端-代理服务器-服务器),这年就足以在代理服务器在对数据入手脚,得步进步

数量防篡改的骨干原理在于对传输的数码开展数字具名。客商端发起呼吁钱,用劳动器端获得的密钥对数据开展前边,然后把签名与数据一齐发送给服务器端,服务器端再用本身的密钥对接到的数据进行数字签字,与传过来的签订协议比较是还是不是一致
上面是有的连锁java代码:

1. 服务器端生成密钥并保存到数据库中
/**
 * 产生HmacSHA512摘要算法的密钥
 * 密钥可以为任意字符串,使用它来生成密钥可以获得更高的安全性
 */  
public byte[] initHmacSHA512Key() throws NoSuchAlgorithmException {  
    // 初始化HmacMD5摘要算法的密钥产生器  
    KeyGenerator generator = KeyGenerator.getInstance("HmacSHA512");  
    // 产生密钥  
    SecretKey secretKey = generator.generateKey();  
    // 获得密钥  
    byte[] key = secretKey.getEncoded();  
    return key;  
}

//把byte数组转为为字符串方便存入数据库
String secret = new BigInteger(1, initHmacSHA512Key()).toString(16);
2. 顾客端/服务器端对传输的数码测算摘要
//还原密钥字符串为byte数组
byte[] secret = new BigInteger(config.get(key).getConnectSecret(),16).toByteArray();
String sign = Tools.encodeHmacSHA512(postData.getBytes(), secret);

/**
 * HmacSHA512摘要算法
 * 对于给定生成的不同密钥,得到的摘要消息会不同,所以在实际应用中,要保存我们的密钥
 */  
public static String encodeHmacSHA512(byte[] data, byte[] key) throws Exception {  
    // 还原密钥  
    SecretKey secretKey = new SecretKeySpec(key, "HmacSHA512");  
    // 实例化Mac  
    Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
    //初始化mac  
    mac.init(secretKey);  
    //执行消息摘要  
    byte[] digest = mac.doFinal(data);  
    return new HexBinaryAdapter().marshal(digest);//转为十六进制的字符串  
}

骨子里这里的密钥可以为肆意字符串,这里之所以用生成的方法原因为那样长度更加长,更安全,不易破解

防重放

防重放的情致那样的,如若央求链为客商端-代理-服务器,那么违法份子能够在代理上把全副整个诉求拷贝下来,然后再非常长久的前景用拷贝下来的呼吁重新要求服务器获取数据。相当多时候大家是由此cookie消息来让服务器确认顾客端的地位,这种情景就一定于走了一趟外人的大道,然后身份被窃取了。

有两种艺术消除重播攻击难题,一种为随机数办法,第两种为TOTP算法(google的动态验证码就采取这种算法,别的还恐怕有非常多银行的动态密钥)

1.随机数办法

《HTTP权威指南》中的13章讲得很清楚,能够看看这章。间接从书中截个图起首讲

图片 2

RemoteAPI2.jpg

图中的(a)部分为未改革格局,(b)为品质创新措施。从图a中能够见见,每一趟真正请求前都必需发起叁次质询央求得到授权授权码(随机数),然后再发起真正央求,在真的央求中带上那几个授权码,服务器收到到须求后先证实授权码是还是不是存在,不设有则表示非法,假使存在,则删除旧的授权码。相当每次请求都必须带上授权码,且一个授权码只能使用一次。图(b)是做的一个更始,不用每一回央浼前都呼吁一回,只必要须要三遍就可以,每一趟正式央求成功后都回来下一遍的授权码。

骨子里中的难点:供给怀恋http乞请的产出天性,在出现情况下稳当生成与删除授权码

2.TOTP算法

这种算法跟google的动态验证码同样,顾客端与服务器端通过一样的密钥与时间转移授权码(在一段时间内一蹴而就,需确定保障服务器端与客商端无时间差距,或差距非常的小)
算法验证:

google动态验证码原理:服务器端通过一定算法随机生成三个密钥,而且把那几个密钥保存在数据库中。依照变化的密钥在页面上生成三个二维码,内容是二个UENCOREI 地址。客户通过扫描二维码,把密钥保存在顾客端。 客商端每 30 秒使用密钥和时间戳通过一种算法生成一个 6 位数字的一次性 密码。服务器端使用保留在数据库中的密钥和岁月戳通过同样种算法生成二个 6 位数字的一次性密码, 客户登录时输入三次性密码与劳务器端进行验证,假设一样,就登入成功了。
资料:
<a href=" (谷歌(Google) Authenticator) 的兑现原理是如何?</a>

本文由澳门太阳娱乐手机登录发布于 资质荣誉,转载请注明出处:远程访谈API设计,key生成6位验证码

关键词: