动态密码卡TOTP算法
TOTP NET实现:http://googleauthcsharp.codeplex.com/
引用:http://www.cnblogs.com/wangxin201492/p/5030943.html
1. OTP
OTP(One-Time Password)
译为一次性密码,也称动态口令。是使用密码技术实现的在客户端和服务器之间通过共享秘密的一种认证技术,是一种强认证技术,是增强目前静态口令认证的一种非常方便技术手段,是一种重要的双因素认证技术。
1.1 OTP的认证原理
动态口令的基本认证原理是在认证双方共享密钥,也称种子密钥,并使用的同一个种子密钥对某一个事件计数、或时间值、或者是异步挑战数进行密码算法计算,使用的算法有对称算法
、HASH
、HMAC
,之后比较计算值是否一致进行认证。可以做到一次一个动态口令,使用后作废,口令长度通常为6-8个数字,使用方便,与通常的静态口令认证方式类似.
1.3 OTP的实现方式
- 时间同步(
TOTP
) - 事件同步(
HOTP
) - 挑战/应答(
OCRA
)
2. HOTP
HOTP(HMAC-base On-Time Password)
译为基于HMAC的一次性密码,也称事件同步的动态密码。
2.1 HOTP的工作原理
$$ HTOP(K,C) = Truncate(HMAC-SHA-1(K,C))$$
客户端和服务器事先协商好一个密钥K
,用于一次性密码的生成过程。此外,客户端和服务器各有一个计数器C
,并且事先将计数值同步。而Truncate
是为了获得一个符合HTOP
要求的值。
3 TOTP
TOTP(Time-base One-Time Password)
译为基于时间的一次性密码,也称时间同步的动态密码.
3.1 TOTP的工作原理
$$TOTP = Truncate(HMAC-SHA-1(K,T))$$TOTP
是HOTP
的一个变种,将HOTP
中的计数器C
替换为依托时间的参数T
,T是由当前时间(CurrentUnixTime
、初始时间(T0)、步长(X)决定的。即:
$$ T = (Current Unix time - T0) / X $$
CurrentUnixTime
:当前的Unix时间。T0
: 开始计步初始化时间,默认为0X
: 步长,默认情况下为30s
3.2 TOTP的要求
- 客户端和服务器必须能够彼此知道或者推算出对方的Unix Time
- 客户端和服务器端必须共享一个密钥
- 算法必须使用HOTP作为其关键实现环节
- 客户端和服务器端必须使用相同的步长X
- 每一个客户端必须拥有不同的密钥
- 密钥的生成必须足够随机
- 密钥必须储存在防篡改的设备上,而且不能在不安全的情况下被访问或使用。
- 对该算法中T的实现必须大于
int32
,因为它在2038年将超出上限。 - T0和X的协商必须在之前的步骤中就已经做好了。
3.3 安全性考虑
3.3.1 安全性分析
该算法的安全性和健壮性完全依赖于其关键实现环节HOTP
。
安全性分析的结果是:在所有的测试中,该算法的结果均匀的、独立的分布。这个分析显示,最好的攻击和破解TOTP(HOTP)
的方法是暴力破解。而在算法要求环节,要求key必须有足够的随机性。
3.3.2 时延兼容
在同一个步长内,动态密码生成的结果是一样的。当一个验证系统获得这个动态密码的时候,它并不知道动态密码的生产者是在哪个步长内产生的密码。由于网络的原因,客户端生成密码的时间和服务器接受密码的时间可能差距会很大,很有可能使得这2个时间不在同一个步长内。当一个动态密码产生在一个步长的结尾,服务器收到的密码很有可能在下一个步长的开始。
验证系统应该设置一个策略允许动态密码的传输时延,不应该只验证当前步长的动态密码,还应该验证之前几个步长的动态密码。但越大的传输时延窗口设置,就会带来越大的风险被攻击,我们推荐最多设置一个时延窗口来兼容传输延时。
3.3.3 步长设置
步长大小的设置,直接影响安全性和可用性:
- 一个越大的步长,就会导致一个越大的窗口被攻击。当一个动态密码被生成而且在其有效期内暴露在第三方环境下,那么第三方系统就可以在该动态密码无效前使用这个密码。
- 我们推荐默认的步长时间是
30s
,这个默认值是在权衡了安全性和可用性的基础上提出的。 - 下一个动态密码肯定会在下一个步长生成,用户必须等待当前步长的结束。这个等待时间的理想值会随着步长的设置而增大。一个太长的窗口设置不使用网络用户登录这种场景,用户可能等不了一个步长的时间,就放弃登录
动态密码卡TOTP算法的更多相关文章
- 黄聪:OTP动态密码_Java代码实现
OTP认知 动态口令(OTP,One-Time Password)又称一次性密码,是使用密码技术实现的在客户端和服务器之间通过共享秘密的一种认证技术,是一种强认证技术,是增强目前静态口令认证的一种非常 ...
- TOTP算法实现二步验证
概念 TOTP算法(Time-based One-time Password algorithm)是一种从共享密钥和当前时间计算一次性密码的算法. 它已被采纳为Internet工程任务组标准RFC 6 ...
- 不存数据库生成验证码(totp算法)
以前做验证式的方法都是new Random().Next(10000,99999) 生成随机数了以后存到数据库中的用户表中,用户输入验证码了再查询用户表做比较的,网友说这种做法太LOW B了,应该用T ...
- 毕业设计预习:SM3密码杂凑算法基础学习
SM3密码杂凑算法基础学习 术语与定义 1 比特串bit string 由0和1组成的二进制数字序列. 2 大端big-endian 数据在内存中的一种表示格式,规定左边为高有效位,右边为低有效位.数 ...
- PHP密码散列算法的学习
不知道大家有没有看过 Laravel 的源码.在 Laravel 源码中,对于用户密码的加密,使用的是 password_hash() 这个函数.这个函数是属于 PHP 密码散列算法扩展中所包含的函数 ...
- TOTP算法 基于时间的一次性密码
/** Copyright (c) 2011 IETF Trust and the persons identified as authors of the code. All rights rese ...
- CCF 第六次计算机职业认证 第四题 收货 stl动态存储和fleury算法的综合应用
问题描述 为了增加公司收入,F公司新开设了物流业务.由于F公司在业界的良好口碑,物流业务一开通即受到了消费者的欢迎,物流业务马上遍及了城市的每条街道.然而,F公司现在只安排了小明一个人负责所有街道的服 ...
- DevExpress 中根据数据库字典动态生成卡式菜单 z
第三方的Devexpress套件因为要使用权限机制控制不同用户进入系统显示菜单所以要配合字典数据动态生成.在WEB中这种问题灰常的轻松在winform里就稍微有点不同为了用DEV实现卡式菜单有组的概念 ...
- 动态时间规整-DTW算法
作者:桂. 时间:2017-05-31 16:17:29 链接:http://www.cnblogs.com/xingshansi/p/6924911.html 前言 动态时间规整(Dynamic ...
随机推荐
- aehyok.com的成长之路三——框架结构
前言 首先奉上个人网站地址传送门:aehyok.com. aehyok.com的成长之路一——开篇 中主要阐述了自己为什么建立自己的网站,以及个人网站的大致方向. aehyok.com的成长之路二—— ...
- git的几十个基本面
1.下载git?git-scm.com 2.获取帮助git helpgit help config 3.什么是Git?版本控制系统,Version Control System, VCS.它允许我们提 ...
- (转)阴影锥(Shadow Volume)
转自:http://blog.csdn.net/zjull/article/details/11819923 Shadow Map和Shadow Volume是当今比较流行的实时阴影渲染方法,跟Sha ...
- 解决Visual Studio 2010/2012的RC4011 warnings
如果在vc10/11工程的rc文件中有以下任意一行代码: #include <winuser.h> #include <richedit.h> 那么vc将会给出一对警告: C: ...
- eclipse快捷键调试总结【转】
http://www.cnblogs.com/yxnchinahlj/archive/2012/02/22/2363542.html (1)Ctrl+M --切换窗口的大小(2)Ctrl+Q --跳到 ...
- 菜鸟教程之工具使用(十二)——Eclipse突出显示选中的相同变量
大家都知道在Eclipse中,选中一个变量或者方法名(或者说是一个单词),当前文件中跟他一样的变量会被突出显示,这个功能很好用.能让我们很方便的找到该变量在哪被用到了.前段时间我的Eclipse的这个 ...
- dolby逝世:纪念一下
杜比公司的成立快50年了(1965),想想中国1965年在干啥.中国怎么可能有. 小科普一下,dolby的成功有3个时间点和技术,第一次是在英国开发了dolby B降噪技术,是用在早期的卡带降噪 ...
- 自定义 scrapy 爬虫的 requests
之前使用 scrapy 抓取数据的时候 ,默认是在逻辑中判断是否执行下一次请求 def parse(self): # 获取所有的url,例如获取到urls中 for url in urls: yiel ...
- mvc edmx 的config文件
<?xml version="1.0" encoding="utf-8"?> <configuration> <connectio ...
- LoadRunner执行过程报错“Failed to connect to server "xxx.xxx.xxx.xxx:xx":[10060] connetion time out”
执行性能测试过程中,LR报错: Action.c(6):Error -27796: Failed to connect to server "xxx.xxx.xxx.xxx:xx" ...