杨茂云 王丹婷 张笃振
摘要:安全口令要求口令长度长、字符类型多、排列无规律,因而不容易记忆。虽然把加密的口令保存在介质上可以避免遗忘口令,但是一旦存储介质丢失,用户就不能找回口令。提出了一个口令保护方法,首先基于HMAC把用户账号和用户秘密转换成N字节的随机串,然后动态确定口令字节串在随机串中的起始位置,从而得到L(L 关键词:口令保护;HMAC;Base94+ 中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2021)13-0061-02 身份认证技术可以防止敌手非法侵入信息系统,身份认证技术主要有基于生物信息的身份认证技术,比如指纹、虹膜;基于隐私秘密的身份认证技术,比如口令认证,公钥密码认证。口令认证由于其原理简单且实现成本低,得到了广泛应用,几乎所有的信息系统都采用口令认证技术。口令认证易遭受口令试探攻击,口令试探攻击主要有蛮力攻击和字典攻击两种形式: (1)蛮力攻击。蛮力攻击是攻击者通过穷举口令空间来试探出正确口令的一种攻击方式。通过限制登录次数、增加口令空间来对抗蛮力攻击,例如增加口令的长度和口令字符类型的数量。 (2)字典攻击。长度长、字符类型多的口令不容易记忆,用户为了避免遗忘口令,往往用身边熟悉的、容易记忆的信息,比如简单数字串、生日、电话号码、姓名的字母组合来做口令,这些口令的安全性不高,是弱口令。攻击者事先收集大量的弱口令做成口令字典文件,当入侵系统时,攻击者在口令字典文件中搜索试探正确口令,这种攻击方式就是字典攻击。字典攻击的成功率和效率较高,只要采用无规律的口令就可以对抗字典攻击。 上述两种攻击方式可以看出:用户只有选择字符类型多、长度长、无规律的口令,这样的口令安全性高,是强口令。强口令不容易记忆,用户为了避免遗忘强口令,往往会把口令存储在某种介质中,比如纸本、电子存储介质等。这些介质一旦丢失,就会造成口令泄露。目前,常用加密的方式存储口令,比如硬件有口令安全卡、软件有口令安全钱包等。口令安全卡、口令安全钱包一旦丢失,虽然不会泄露口令,但是用户也不能找回口令。总之,基于加密存储的方式也不能保护口令安全。 本文基于密码技术设计一种不需要存储介质的口令保护方法。用户注册系统账户时,基于账号和密钥生成满足安全需求的口令完成注册,登录系统时用账号和密钥再次生成口令登录系统,不需要记忆和存储口令从而保护了口令安全。该方法可以用软件和硬件实现,比如软件实现可以基于该方法设计App、小程序,硬件实现可以基于该方法设计IC卡等等。 1相关技术 1.1Base94+编码 把字节串转换成字符需要进行编码,常用的编码有ASCII编码、UNICODE编码、Base64编码等。口令要用可显示的打印字符,键盘上共有94个可显示的打印字符,设计Base94+编码表如表1所示。 1.2 HMAC 基于Hash的消息认证码HMAC(Hash-based Message Authentication Code)是一种基于Hash函数和密钥进行消息认证的方法,在IPSec和SSL中得到广泛应用,是事实上的Internet标准[1]。 HMAC=Hash(Secret,Message),Hash函数可以选择SHA-1、SM3[4]等,也可以采用对称密码技术,比如AES128、SM4[4]等。由于Hash函数的单向性[1],即使恶意的第三者截获HMAC也不可能知道Secret,这意味着只有掌握Secret的用户才能计算HMAC。另外Hash函数的输出是随机的,HNAC可以看作是一个伪随机数发[2]。 2口令生成方法 提出的口令生成方法如图1所示,用户注册账户时通过账号和秘密生成口令,当用户登录系统时,通过同样的计算就又得到同样的口令,口令不需要保密存储。 2.1生成随机字节串 用户进行系统注册时,选择一个账号account和一个密钥secret,计算得到N字节(N必须大于口令长度L)的随机字节串randomByteStr,如式(1)所示。 randomByteStr=Hash(secret,account) (1) 2.2动态确定口令字节串起始位置 首先获取randomByteStr的第0字节,取最低4比特做口令字节串的起始位置s,后续字节的位置分别为(s+1)modN,(s+2)modN…(s+L-1)modN。例如:如图2所示,randomByteStr的长度N=10字节,randomByteStr的第0字节是a7,因而口令字节串的起始位置是7。若口令长度L=6字符,那么口令字节串是0xc1、0x40、0x91、0xa7、0x10、0xf3。 2.3口令生成算法 3安全性分析 (1)攻击者即使知道账号信息account,因为不知道秘密secret,因此不能获得randomByteStr,也就不能得到与账号对应的口令。另外攻击者即使知道randomByteStr,由于Hash函数的单向性[3],攻击者也不能获得用户的secret。敌手获得口令的最好方法是蛮力攻击,只要secret足够复杂,蛮力攻击就是不可行的。 (2)Hash函数是一个伪随机数发生器,通过Hash函数得到的randomByteStr可以是随机的,动态确定口令字节串的起始位置也进一步增加了随机性,这样得到的口令是随机的。 (3)Base94+的编排方式保障了特殊字符出现32次,大写字母出现32次,小写字母出现32次,数字出现32次。当口令长度是L字符,则生成至少含有三类字符的口令的概率是: (4L-4-6(2L-2))/4L。口令长度越长,生成至少含有三类字符口令的概率越大,例如口令长度L=8,则生成至少含有三类字符的口令的概率约为97.67%。 4结语 应用系统基本都采用口令进行身份认证,大多数应用系统一般都要求口令中包含特殊字符、英文字母、数字并且长度要大于8。这样的口令不好记忆,用户忘记口令,需要进行密码找回操作,这既麻烦又不能保护口令安全。提出的口令生成方法能快速生成包含特殊符号、字母、数字的口令,用IC卡或者App、小程序实现该方法,口令可以即用即得,不用存储和记忆,可以很好地保护口令安全。 参考文献: [1] H. Krawczyk,M. Bellare,R. Canetti. HMAC: Keyed-Hashing for Message Authentication[EB/OL].https://tools.ietf.org/html/rfc2104 [2] D. M'Raihi,M. Bellare,and F. Hoornaert,HOTP: An HMAC-Based One-Time Password Algorithm[EB/OL].https://tools.ietf.org/html/rfc4226. [3] 楊茂云,信息与网络安全[M].北京:电子工业出版社,2007. [4] 国家密码管理局.国家密码管理局关于发布《祖冲之序列密码算法》等6项密码行业标准公告[EB/OL].http://www.sca.gov.cn/sca/xwdt/2012-03/21/content_1002392.shtml. 【通联编辑:代影】