zoukankan      html  css  js  c++  java
  • 程序员之网络安全系列(六):动态密码

    系列目录

    前文回顾

    程序员之网络安全系列(二):如何安全保存用户密码及哈希算法 我们保证了数据的完整性

    程序员之网络安全系列(三):数据加密之对称加密算法 我们对数据进行了加密

    程序员之网络安全系列(四):数据加密之非对称加密算法
    我们使用了非对称密钥算法,我们让“隔壁王叔叔”传递了秘钥。

    程序员之网络安全系列(五):数字证书以及12306的证书问题
    我们使用了数字证书,确保了对方的公钥身份,也就是互联网中确定了要访问的网站就是你要访问的网站。

    但是我们如何确定要访问这个网站的用户就是要访问的用户呢? 对银行来说需要确保“敏捷的水”登录银行时,必须是"敏捷的水" 而不是别人,不然别人就把钱转走了。

    虽然我们从通信,数据加密等方式确保用户密码不背攻击者破解,但是如果攻击者使用键盘记录器等工具知道了用户密码,那么就可以冒充用户了。

    比如银行的U盾,因为我对这块业务不了解,我猜银行为每个用户发放了一个公钥?( 知道的同学,可以帮忙解释一下银行的U盾都做了什么? )

    我们用数字证书确定了银行的身份,那么银行如何确定我们的身份呢?

    两步验证

    那么什么是两步认证呢?两步认证就是在每次登陆时候填一个手机短信收取的验证码或者手机应用生成的验证码。当然接收验证码的手机号或者应用是需要绑定的,这样只有拿到这部手机并且知道你帐号密码的人才能登陆帐号。

    为什么需要它?

    对有些人来说,盗取密码比您想象的更简单

    以下任意一种常见操作都可能让您面临密码被盗的风险:

    • 在多个网站上使用同一密码
    • 从互联网上下载软件
    • 点击电子邮件中的链接

    想像一下您无法访问自己的帐户及其中的内容,当别有用心的人盗取您的密码后,他们能让您无法访问自己的帐户,还可以执行以下操作:

    • 翻看(甚至删除)您所有的电子邮件、联系人、照片等
    • 冒充您给您的联系人发送垃圾邮件或有害的电子邮件
    • 使用您的帐户重置您其他帐户(银行帐户、购物帐户等)的密码

    两步验证可以将别有用心的人阻挡在外,即使他们知道您的密码也无可奈何。

    如何工作?

    现在大部分比较危险的操作都需要绑定手机号,因为手机号是你用的唯一的。接收到验证码后,我们再输入系统做第二次的验证。

    但是由于我们这个验证码也有可能丢失,那么我们只需要让他在一定时间有效就可以了,这就是OTP.

    动态口令 (One Time Password)

    动态密码: 一个OTP(One Time Password) 是一个密码仅用于一次登录会话或者交易,使用过后,这个密码就无效了。

    静态密码的问题:

    • 容易被破解
    • 容易被猜测
    • 容易被盗劫
    • 针对不同的网站,用户需要记忆大量的密码。

    使用动态口令主要有2个方面价值:

    • 防止由于盗号而产生的财产损失。
    • 采用动态口令的单位无需忍受定期修改各种应用系统登录密码的烦恼。

    有两种方法,生成动态密码:

    Event-based OTP (EOTP)

    基于事件同步的令牌,其原理是通过某一特定的事件次序及相同的种子值作为输入,在DES算法中运算出一致的密码,其运算机理决定了其整个工作流程同时钟无关,不受时钟的影响,令牌中不存在时间脉冲晶振。但由于其算法的一致性,其口令是预先可知的,通过令牌,你可以预先知道今后的多个密码,故当令牌遗失且没有使用PIN码对令牌进行保护时,存在非法登陆的风险,故使用事件同步的令牌,对PIN码的保护是十分必要的。同样,基于事件同步的令牌同样存在失去同步的风险,例如用户多次无目的的生成口令等,对于令牌的失步,事件同步的服务器使用增大偏移量的方式进行再同步,其服务器端会自动向后推算一定次数的密码,来同步令牌和服务器,当失步情况已经非常严重,大范围超出正常范围时,通过连续输入两次令牌计算出的密码,服务器将在较大的范围内进行令牌同步,一般情况下,令牌同步所需的次数不会超过3次。但在极端情况下,不排除失去同步的可能性,例如电力耗尽,在更换电池时操作失误等。此时,令牌仍可通过手工输入由管理员生成的一组序列值来实现远程同步,而无需寄回服务器端重新同步。

    Time based OTP (TOTP)

    基于令牌和服务器的时间同步,通过运算来生成一致的动态口令,基于时间同步的令牌,一般更新率为60S,每60S产生一个新口令,但由于其同步的基础是国际标准时间,则要求其服务器能够十分精确的保持正确的时钟,同时对其令牌的晶振频率有严格的要求,从而降低系统失去同步的几率,从另一方面,基于时间同步的令牌在每次进行认证时,服务器端将会检测令牌的时钟偏移量,相应不断的微调自己的时间记录,从而保证了令牌和服务器的同步,确保日常的使用,但由于令牌的工作环境不同,在磁场,高温,高压,震荡,入水等情况下易发生时钟脉冲的不确定偏移和损坏,故对于时间同步的设备进行较好的保护是十分必要的。对于失去时间同步的令牌,目前可以通过增大偏移量的技术(前后10分钟)来进行远程同步,确保其能够继续使用,降低对应用的影响,但对于超出默认时间(共20分钟)的同步令牌,将无法继续使用或进行远程同步,必须返厂或送回服务器端另行处理。同样,对于基于时间同步的服务器,应较好地保护其系统时钟,不要随意更改,以免发生同步问题,从而影响全部基于此服务器进行认证的令牌。

    ** 以上两种方式在生成密码的过程都不需要与服务器通信,所以极大的保证了密码的安全。**

    算法的实现

    http://tools.ietf.org/html/rfc6238

  • 相关阅读:
    源码分析清楚 AbstractQueuedSynchronizer
    Java 并发队列 BlockingQueue
    ReentrantLock以及AQS实现原理
    Java并发之Condition
    Java线程的6种状态及切换
    同步工具类
    Java 并发实践 — ConcurrentHashMap 与 CAS
    Java7/8 中的 HashMap 和 ConcurrentHashMap
    java HashMap、HashTable、ConcurrentHashMap区别
    Mysql的复制原理以及流程
  • 原文地址:https://www.cnblogs.com/cnblogsfans/p/5126490.html
Copyright © 2011-2022 走看看