用户身份认证

传统的静态密码安全性之低,使其不能用在一些对安全要求很高的领域。

目前主流的身份认证方式有几种,OTP(One Time Password)方式的身份认证,基于PKI的身份认证以及基于生物特征的认证等。

OTP

OTP一般采用OATH标准的TOTP或HOTP算法。算法基于使用HMAC(hash message authentication code)的摘要算法,两端共享密钥,添加动态因子,防止重放攻击。

HTOP的算法为
HOTP(K,C) = Truncate(HMAC-SHA-1(K,C))

K为共享密钥,C为计数器。HTOP用于计数同步型的口令牌。

TOTP算法则基于时间动态因子,服务器和口令牌在相同的时间窗口内基于共享密钥分别进行计算,在允许的时间窗口内计算结果一致即为认证成功。对服务器和令牌的时钟要求比较高。TOTP用于时间型口令牌。

OTP有这么几种常见的方式:

  • 口令矩阵卡
    这是成本很低,也比较简陋的OTP认证方式。每次认证使用不同坐标组合的口令,简单有效。但是很容易被复制而无法觉察,现在已经很少使用。
  • 动态口令牌
    非接触式,采用独立硬件的动态口令牌。共享密钥当面分发,口令牌的密钥内置其硬件中,密钥设计为无法从外部读取,口令牌本身无法拆解,暴力拆解会无法使用,通过这些方式来加强其口令牌的安全性。动态口令牌的安全性依赖于其密钥的安全性,一般采用位数较长的密钥。

由于采用非接触式使用方式,可以完全杜绝PC恶意程序的攻击。还可以采用PIN(Personal Identification Number)码对令牌进一步加强保护。

但是动态口令卡无法防止中间人攻击(man in the middle),这可以通过使用SSL/HTTPS来防止中间人攻击。这种情况下,如果有人伪造证书,浏览器是会有警告的。还有一种迷惑性很强的欺骗方式,注册一个与真实站点域名十分相近的域名,然后申请真正的数字证书,网站做的与真实站点一模一样。如果被诱导到此种网站,后果就严重了,再强大的加密算法都于事无补。

  • 手机动态口令
    由于独立硬件的令牌成本比较高,而手机的普及率又很高,因此又出现了手机动态口令这种认证方式。其实手机正好符合非接触式,独立硬件的条件,只不过不是专用的硬件而已。手机动态口令不受网络信号的影响,手机端与服务器认证端也是独立同步运算的。

手机动态口令的密钥分发要保证安全,因为是软件实现方式,与手机其他软件一起运行,因此有可能会受手机恶意软件的影响,如果在手机端直接使用动态口令进行认证登录,还是存在一些风险。PC登录与手机动态口令分开的话会比较安全。

  • 短信随机密码
    这种方式依赖于移动网络,每次需要身份认证时,会发一个随机密码到绑定的手机上。这种方式也有弱点,比如有人伪造机主身份证件恶意补卡,GSM短信被截获等。手机动态口令使用短信绑定时,也有短信被劫持的风险存在。

PKI认证方式

PKI的基本原理为基于大数因数分解的难度,生成一对密钥,公钥(public key)和私钥(private key)。使用公钥加密的信息,只能使用私钥来解密,反之亦然。

公钥可以公开发布,而私钥必须要小心的保管,以防泄漏。但是公钥发布时也存在一个问题,如何保证公钥就是发布者宣称的那个人的公钥,所以就有了数字证书

CA(Certificate Authority)是大家都认可的机构,CA的公钥是周知的,一般浏览器里都带有很多CA的根证书,里面就有CA的公钥。

用户申请数字证书时,CA会验证用户的身份,并将用户的身份信息与其公钥绑定在一起进行数字签名,这就是用户的数字证书。有了数字证书后,用户可以用其进行数字签名,保证数据的完整性和不可抵赖。这是一个信任链,如果CA私钥泄漏,则整个信任链就垮塌了。

公钥的认证也可以采用公认的公钥服务器的形式,比如GPG使用的方式。

数字签名的流程为,将要发送的信息计算摘要并使用私钥加密,然后与正文信息一起发送。接收者受到信息后,用相同的算法计算正文的摘要,然后使用签名者的公钥解密作者发送过来的加密后的摘要,如果二者一致则证明信息是完整的,没有被篡改的,也是不能抵赖的。

数字证书就是CA将用户的公钥和验证过的身份信息使用CA的私钥进行数字签名而来的,可以使用CA根证书中的公钥来验证数字证书的真伪。

然后用户又可以拿自己的数字证书来进行数字签名,这是一个完整的链条。而CA的数字证书是拿自己的私钥自签的,所以CA并不神秘,但是浏览器内置了其自签的数字证书,并称之为CA根证书。

HTTPS服务器也是使用数字证书来表名自己的身份,其数字证书会绑定域名和所有者及其组织的相关信息。也可以在HTTPS协议上使用双向认证。

常见的PKI身份认证方式:
其实无论是数字证书还是USB KEY,都是使用非对称加密PKI(公钥和私钥对)来进行用户认证,只是密钥的保存方式有些区别而已。

  • CA数字证书
    早期需要高级别安全的领域,使用数字证书来认证,比如网上银行。银行为用户颁发个人数字证书,个人持有私钥和公钥,银行持有个人的公钥。登录认证时,银行会发送一个challenge随机码,又叫挑战或冲击,客户使用自己的私钥加密收到的challenge,然后发送到银行服务端,银行服务器使用客户的公钥解密客户发回的加密信息,又叫应答或响应,如果解密后的结果与银行发给客户的挑战码一致,则可以说明是正确的用户。
    如果客户持有银行的公钥,这个认证过程也可以是双向的,让客户端也确认是连接到正确的银行网站。

但是因为木马病毒等恶意程序横行,客户的私钥很容易被窃取,因此这种方式逐渐被淘汰了,现在应该没有人用了。

  • USB KEY
    这种方式直接将用户私钥存储在key的受保护数据区,私钥是不可读取的,所有的加密都在key内部进行,电脑端无法看到加密的过程,只能输入需要加密的数据和接收加密后的数据,因此安全性大大提高。服务器端发来的挑战随机码被送入key内部,key加密完成后将结果送到PC端,然后传输给服务器。一般USB KEY会有pin码保护,只有用户输入正确的pin码才可以使用,而且多次输入错误的密码,key会被锁定。
    虽然木马等恶意程序已经无法再获取到用户的私钥,但是如果用户将key插到电脑上,而且已经输入了正确的pin码,离开时忘记将key拔出,则木马等恶意程序仍然可以通过用户的电脑获得非法的身份认证。所以有些USB KEY设计了物理实体按键,每次认证需要按KEY上的物理键确认操作才可以,木马等恶意程序也就无能为力了。

总体来讲,基于PKI非对称密钥的认证方式是更安全的。动态口令牌采用共享密钥同步计算的方式来认证。不过挑战/应答型的动态口令牌也可以采用PKI认证方式,这种口令牌会有一个输入键盘,客户端电脑上显示服务器端发来的挑战随机码,用户将挑战码输入口令牌,口令牌使用内部的私钥计算出加密后的应答码,然后用户将应答码通过PC返回给服务端。这种口令牌也可以用于数字签名。如果口令牌内存放服务端的公钥,也可以进行双向认证。

采用PKI认证方式加pin码保护的挑战/应答型动态口令牌是十分安全的,只是使用起来可能有些繁琐。

References:
[1]身份验证的 2 步验证

===
[erq]