[信息安全] 4.一次性密码 amp;amp;amp;amp; 身份认证三要素

在信息安全领域,一般把Cryptography称为密码,而把Password称为口令。日常用户的认知中,以及我们开发人员沟通过程中,绝大多数被称作密码的东西其实都是Password(口令),而不是真正意义上的密码。本文保持这种语义,采用密码来代指Password,而当密码和口令同时出现时,用英文表示以示区分。

0. OTP一次性密码

OTP是One Time Password的简写,即一次性密码。在平时生活中,我们接触一次性密码的场景非常多,比如在登录账号、找回密码,更改密码和转账操作等等这些场景,其中一些常用到的方式有:

  1. 手机短信+短信验证码;

  2. 邮件+邮件验证码;

  3. 认证器软件+验证码,比如Microsoft Authenticator App,Google Authenticator App等等;

  4. 硬件+验证码:比如网银的电子密码器;

这些场景的流程一般都是在用户提供了账号+密码的基础上,让用户再提供一个一次性的验证码来提供一层额外的安全防护。通常情况下,这个验证码是一个6-8位的数字,只能使用一次或者仅在很短的时间内可用(比如5分钟以内)。

1. HOTP基于消息认证码的一次性密码

HOTP是HMAC-Based One Time Password的缩写,即是基于HMAC(基于Hash的消息认证码)实现的一次性密码。算法细节定义在RFC4226(https://tools.ietf.org/html/rfc4226),算法公式为: HOTP(Key,Counter)  ,拆开是 Truncate(HMAC-SHA-1(Key,Counter)) 。

  1. Key:密钥;

  2. Counter:一个计数器;

  3. HMAC-SHA-1:基于SHA1的HMAC算法的一个函数,返回MAC的值,MAC是一个20bytes(160bits)的字节数组;

  4. Truncate:一个截取数字的函数,以3中的MAC为参数,按照指定规则,得到一个6位或者8位数字(位数太多的话不方便用户输入,太少的话又容易被暴力猜测到);

C#实现基于HMAC的OTP的代码:

 1 public static string HOTP(byte[] key, byte[] counter, int length = 6)
2 {
3
var hmac = counter.ToHMACSHA1(key);
4

5
var offset = hmac[hmac.Length - 1] & 0xF;
6

7 var b1 = (hmac[offset] & 0x7F) << 24;
8
var b2 = (hmac[offset + 1] & 0xFF) << 16;
9
var b3 = (hmac[offset + 2] & 0xFF) << 8;
10 var b4 = (hmac[offset + 3] & 0xFF);
11
12 var code = b1 | b2 | b3 | b4;
13
14 var value = code % (int)Math.Pow(10, length);
15
16 return value.ToString().PadLeft(length, '0');
17 }

调用一下试试看:

1 //密钥key
2 var key = "lnh_key".ToBytes(Encoding.UTF8);
3 //计数器
4 var counter = "lnh_counter".ToBytes(Encoding.UTF8);
5 //otp6=752378
6 var otp6 = SecurityHelper.HOTP(key, counter,6);
7 //otp8=49752378
8 var otp8 = SecurityHelper.HOTP(key, counter, 8);

其中key是HOTP算法需要的一个密钥(不可泄露);counter是每次生成HOTP的时候使用的计数器,使用一次就更换一个。然后就可以用来生成OTP了,第一此截取了6位,第二此截取了8位。

2. TOTP基于时间的一次性密码

TOTP是Time-Based One Time Password的缩写。TOTP是在HOTP的基础上扩展的一个算法,算法细节定义在RFC6238(https://tools.ietf.org/html/rfc6238),其核心在于把HOTP中的counter换成了时间T,可以简单的理解为一个当前时间的时间戳(unixtime)。一般实际应用中会固定一个时间的步长,比如30秒,60秒,120秒等等,也就是说再这个步长的时间内,基于TOTP算法算出的OTP值是一样的。废话不多说,看看TOTP算法的核心代码:

1 public static string TOTP(byte[] key, int step = 60, int length = 6)
2 {
3 var unixTime = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;
4 var counter = ((int)unixTime) / step;
5 var counterBytes = BitConverter.GetBytes(counter);
6 return HOTP(key, counterBytes, length);
7 }

调用一下试试看:

//密钥keyvar
key = "lnh_key".ToBytes(Encoding.UTF8);
//在10秒内生成,otp是一样的
for (var i = 0; i < 100; i++) {  
 
var otp = SecurityHelper.TOTP(key, 10, 6);Console.WriteLine(otp);Thread.Sleep(1000); }

3. 身份认证三要素

首先解释下什么是身份认证?其实很简单,就是让对方相信你就是你。那么如何让对方相信你就是你呢?按照你能提供的信息的等级来划分,大致有如下三种信息可以证明你就是你自己:

  1. 你所知道的信息:比如我们最广泛使用的“用户名+密码”,因为只有你自己知道“用户名+密码”这个信息组合,那么当你把这个组合提供给我的时候,我就可以相信你就是你。

  2. 你所拥有的信息:假如你的“用户名+密码”泄露给了第三方,这个时候你就会有被第三方冒充的危险了。怎么办呢,再进一步提供一个只有你自己拥有的信息,即可防止被第三方冒充的危险。

  3. 你所独有的信息:再假设一下,你拥有的信息也被泄露给了第三方,这个时候你又会面临被冒充的危险。再进一步,提供一个只有你自己所独有的的信息,比如你的指纹,虹膜,面部特征等等。

3.1 2SV 两步验证(Two Steps Verification)

两步验证现在是一个再加强认证安全方面广泛使用的一个解决方案。比如Google的2SV(https://www.google.com/landing/2step/),Microsoft的2SV(https://support.microsoft.com/zh-cn/help/12408/microsoft-account-about-two-step-verification)等等,通常的做法是当用户输入了"用户名+密码"的基础上,会让用户再提供一个一次性密码(以短信、邮件,或者动态密码生成器app的方式发放给用户)。再有比如在一些服务中需要用户额外设置的安全问题,比如“你的出生地在哪?”等等此类。

3.2 2FA双因素认证(Two Factor Authentication)

2SV有个孪生兄弟2FA(双因素认证:Two Factor Authentication),那么关于2SV和2FA有什么区别呢,比如让用户在“用户名+密码”的基础上提供的额外的一次性密码,关于这个一次性密码到底是属于“你所知道的信息”还是“你所拥有的信息”呢?并没有明显的区分界限,有兴趣的可以看看这里的讨论:https://security.stackexchange.com/questions/41939/two-step-vs-two-factor-authentication-is-there-a-difference 。 如果你觉得这个一次性密码属于“你所知道的信息”,那么你可以认为它是2SV;如果你觉得这个一次性密码属于“你所拥有的信息”,那么你可以认为它是2FA。

总结来说,2FA就是使用了身份认证中的2个要素。

总结 & 参考

简单的介绍了下一次性密码的原理以及其应用场景,完整的代码请移步:https://github.com/linianhui/code/blob/master/src/SecurityHelper.cs 。如有错误之处,欢迎指正!

参考资料

OTP(One Time Password)Wiki:https://en.wikipedia.org/wiki/One-time_password

One Time Password System:https://tools.ietf.org/html/rfc2289

HOTP(HMAC-Based One Time Password) Wiki:https://en.wikipedia.org/wiki/HMAC-based_One-time_Password_Algorithm

HOTP(HMAC-Based One Time Password)RFC:https://tools.ietf.org/html/rfc4226

TOTP(Time-Based One Time Password)Wiki:https://en.wikipedia.org/wiki/Time-based_One-time_Password_Algorithm

TOTP(Time-Based One Time Password)RFC:https://tools.ietf.org/html/rfc6238

2SV vs 2FA (1):https://security.stackexchange.com/questions/41939/two-step-vs-two-factor-authentication-is-there-a-difference

2SV vs 2FA (2):https://paul.reviews/the-difference-between-two-factor-and-two-step-authentication/

MFA/2FA(Multi Factor Authentication) Wiki:https://en.wikipedia.org/wiki/Multi-factor_authentication

相关文章: 

  • [信息安全] 1.密码工具箱

  • [信息安全] 2.密码工具箱(续)

  • [信息安全] 3.HTTPS工作流程

原文地址:http://www.cnblogs.com/linianhui/p/security-one-time-password.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324430.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

干货!sqlserver数据库所有知识点总结整理,含代码(挺全的)

01T-SQL案例整理已知有一个表&#xff1a;该表的字段有&#xff1a;id,name,date,gradeid,email&#xff0c;表名为table_name,按要求实现下面内容。1.插入一条记录&#xff1a;insert into table_name values (1,刘世豪,2017-10-21,1,666qq.com)2.将学号是1的学生姓名修改成张…

深入源码分析Java线程池的实现原理

转载自 深入源码分析Java线程池的实现原理 程序的运行&#xff0c;其本质上&#xff0c;是对系统资源&#xff08;CPU、内存、磁盘、网络等等&#xff09;的使用。如何高效的使用这些资源是我们编程优化演进的一个方向。今天说的线程池就是一种对CPU利用的优化手段。 网上有…

“桌面日历”记录的事件居然是看某某视频……

某年某月某下午&#xff0c;正在激情澎湃的在讲台上讲课&#xff0c;忽发现医学生缓缓的将右手举起来&#xff0c;见状&#xff0c;不用想&#xff0c;他一定有问题&#xff0c;嗯……要问我。于是&#xff0c;紧走几步下去&#xff0c;问他怎么了&#xff0c;他说他的某某功能…

开源个.NetCore写的 - 并发请求工具PressureTool

本篇和大家分享的是一个 并发请求工具&#xff0c;并发往往代表的就是压力&#xff0c;对于一些订单量比较多的公司这种情况很普遍&#xff0c;也因此出现了很多应对并发的解决方案如&#xff1a;分布式&#xff0c;队列&#xff0c;数据库锁等&#xff1b; 对于没有遇到过或者…

浅析DNS域名解析过程

转载自 浅析DNS域名解析过程 对于每一个HTTP请求发起过程中&#xff0c;都有很重要的一个步骤——DNS解析&#xff0c;本篇文章将跟着DNS解析过程来分析域名是如何解析的。 一、DNS域名解析步骤 下图是DNS域名解析的一个示例图&#xff0c;它涵盖了基本解析步骤和原理。 下…

最好的方法,是为你们量身定制!

昨天还和佟老师在讨论3班的学习情况&#xff0c;整体来说&#xff0c;学习氛围还是比较好的。由于近几天各种事纠结在一块儿&#xff0c;本来想给三班的学生制作一个提升计划&#xff0c;一直都腾不出来手。今天&#xff0c;终于抽了一点点时间&#xff0c;在原来互帮互助计划的…

Entity Framework Core 命名约定

注意&#xff1a;我使用的是 Entity Framework Core 2.0 (2.0.0-preview2-final)。正式版发布时&#xff0c;功能可能存在变动。Entity Framework 迁移允许从模型生成数据库&#xff0c;这意味着必须从类名和属性名生成数据库对象的名称。对于大多数人来说使用默认名称是没有问…

ZOJ1654-Place the Robots【最大匹配,图论】

正题 大意 一个n*m个地方&#xff0c;有墙&#xff0c;草地和空地。在空地可以放机器人&#xff0c;机器人会将看到的其他机器人 [河蟹] 掉。他不能隔墙看。求最多能放多少个机器人。 解题思路 这里用一种奇特的构图方法&#xff0c; &#xff08;盗一下ppt里的图&#xff0…

彻底理解JVM常考题之分级引用模型

转载自 彻底理解JVM常考题之分级引用模型 本文通过探析Java中的引用模型&#xff0c;分析比较强引用、软引用、弱引用、虚引用的概念及使用场景&#xff0c;知其然且知其所以然&#xff0c;希望给大家在实际开发实践、学习开源项目提供参考。 Java的引用 对于Java中的垃圾…

越优秀的人越努力,越努力的人越幸运!

昨日晚间&#xff0c;学校值班&#xff0c;在楼道里面巡查几遍之后发现无异常情况&#xff0c;接着就去值班室中打开电脑忙自己的事。过了没一会儿&#xff0c;3班三学生去找我了&#xff0c;对我说&#xff0c;最近班里的学习情况不是太好&#xff0c;部分学生上课容易打盹&am…

SOA和微服务之间的区别

近几年&#xff0c;我们有很多文章对SOA和微服务之间的不同点和相似点进行了分析。有些人认为SOA有很多地方是值得微服务学习的&#xff0c;而有些人则认为区别对待微服务和SOA会更好。而Neal Ford认为&#xff0c;将单体迁移到面向服务的架构要比迁移到微服务来得容易。关于选…

考研生的努力程度是有多恐怖!

2021年全国研究生招生考试在12月26日开始&#xff0c;不过我没有参加。早就听闻考研生是多么多么的努力&#xff0c;今日一见&#xff0c;果然名不虚传&#xff0c;在这之前他们是有多努力我不知道&#xff0c;但是今天我所见到他们努力的程度&#xff0c;可以用恐怖来形容。偶…

全文索引 - Pomelo.EFCore.MySql

背景 全文索引&#xff1a;MySQL全文检索是利用查询关键字和查询列内容之间的相关度进行检索&#xff0c;可以利用全文索引来提高匹配的速度。Pomelo.EntityFrameworkCore.MySql&#xff1a;一款第三方MySQL的Entity Framework Core驱动&#xff0c;在GitHub中开源&#xff0c…

“老师,为什么我一上课就感到困,听课听的总是走神?”

“老师,为什么我一上课就感到困,听课听的总是走神?” “老师,为什么我你讲的每个题我都能听明白,但是让我自己做我就一点思路都没有呢?” “老师,我记下来语法了,但是还是不会用怎么办?” “老师,我……” 怎么办?怎么办?急死了! 今天老师就给你解答一下你的为什么…

高并发场景下的限流策略

转载自 高并发场景下的限流策略 在高并发的场景下&#xff0c;我们的优化和保护系统的方式通常有&#xff1a;多级缓存、资源隔离、熔断降级、限流等等。 今天我们来聊聊限流。 为什么需要限流 举个比较简单的例子&#xff0c;正常来说&#xff0c;一个员工A他每天能够处理…

Entity Framework Core 批处理语句

在Entity Framework Core (EF Core)有许多新的功能&#xff0c;最令人期待的功能之一就是批处理语句。那么批处理语句是什么呢&#xff1f;批处理语句意味着它不会为每个插入/更新/删除语句发送单独的请求&#xff0c;它将在数据库的单次请求中批量执行多个语句。在这篇文章中&…