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

简介: 在信息安全领域,一般把Cryptography称为密码,而把Password称为口令。日常用户的认知中,以及我们开发人员沟通过程中,绝大多数被称作密码的东西其实都是Password(口令),而不是真正意义上的密码。

在信息安全领域,一般把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 }

调用一下试试看:

//密钥key
var 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

作者: Blackheart
目录
相关文章
|
8月前
|
存储 生物认证 网络安全
|
存储 区块链
区块链研习 | 区块链应用中需注意的问题:如何验证新信息的真伪
在不具有数据封闭性的应用中,区块链系统上只能保证所有节点数据的一致性,并不能解决数据真实性的问题。这是常被人们忽视的一个问题。
1707 0
|
8月前
|
监控 安全 数据安全/隐私保护
如何通过手机设置苹果账户的双重认证
如何通过手机设置苹果账户的双重认证
124 1
|
8月前
|
安全 数据安全/隐私保护
如何设置多因素认证,但不使用短信验证码?
【5月更文挑战第14天】如何设置多因素认证,但不使用短信验证码?
115 0
|
存储 安全 网络安全
利用隐私法规的漏洞窃取用户身份
欧盟的通用数据保护条例 (GDPR) 已成为现代隐私法律的试金石,部分原因是它赋予消费者前所未有的对其个人信息使用的控制权。然而,同样的权力可能容易被恶意攻击者滥用。在本文中考虑了社会工程师如何滥用围绕“访问权”(Right of Access)过程的法律歧义。这一假设通过对 150 多家企业的对抗性案例研究进行了验证。发现许多组织未能采取足够的保护措施来防止滥用访问权,从而有可能将敏感信息暴露给未经授权的第三方。这些信息的敏感性各不相同,从简单的公共记录到社会安全号码和帐户密码。这些发现表明,迫切需要改进主体访问请求流程的实施。为此本文提出可能的补救措施,以供政府、行业和个人进一步考虑。
94 2
|
API
对企业用户信息进行认证的几种方式
企业认证的方式有很多种,根据业务类型和平台定位的不同,分为多种不同的形式,一般是通过人工审核和接入数据服务商的数据认证接口进行信息验证,具体常见的认证方式有以下几种。
270 0
对企业用户信息进行认证的几种方式
|
安全 算法
信息安全之消息认证(2)
信息安全之消息认证
154 0
信息安全之消息认证(2)
|
算法 安全 数据安全/隐私保护
信息安全之消息认证(1)
信息安全之消息认证
260 0
信息安全之消息认证(1)
|
安全
秒懂云通信:号码隐私服务如何保护你的信息安全?
现代人越来越关注个人隐私,对手机号码的保护也越来越看重。通过虚拟中间号来保护真实的手机号码的方式已经被普遍采用,它的通过效果以及感知和日常通话是没有区别的。
3481 0
秒懂云通信:号码隐私服务如何保护你的信息安全?
|
安全 数据管理 网络安全
信息被手机APP“窃听”?SSL证书助力保护个人隐私
如何防范手机APP超范围收集个人信息、私自共享给第三方等违规操作问题
495 0

热门文章

最新文章