密钥管理工具调研

2024/06/04 PUF 共 4612 字,约 14 分钟
闷骚的程序员

密钥管理工具

目前市面上的密钥管理工具有Google密钥管理工具、Microsoft 电子钱包、Passkeys等,都是基于FIDO标准的。

FIDO

FIDO(Fast IDentity Online,线上快速身份验证)是一种在线验证用户身份的技术规范,旨在改变目前的主流在线验证的方式(使用密码作为主要验证手段),消除或减弱用户对密码的依赖。

FIDO协议

FIDO协议分为两大类:UAFU2F

  • UAF: Universal Authentication Framework protocol.
    UAF 支持指纹、语音、虹膜、脸部识别等生物身份识别方式。无需用户密码(Passwordless)介入,直接进行验证交易。用户在注册阶段,根据服务器支持的本地验证方式,选择一种验证方式,如:指纹识别,人脸识别,语音识别,等等,服务器也可保留密码验证方式,将密码和生物识别相结合,增强账户安全性。

  • U2F: Universal Second Factor (U2F) protocol. 
    U2F类似国内的二代U盾的保护机制,使用双因子(密码和能与用户交互的设备)保护用户账户和隐私。用户在注册阶段,使用服务器支持的加密设备,将账户和设备绑定。当进行登录验证操作时,服务器在合适的时候,提示用户插入设备并进行按键操作,加密设备对数据签名,发送给服务器,服务器做验证,如果验证成功,用户则可登录成功。由于有了第二因子(加密设备)的保护,用户可以选择不设置密码或者使用一串简单易记的4位密码。

FIDO工作原理

FIDO协议使用标准的非对称公私钥对来提供安全保障。确切的说,FIDO草案中使用的是ECDSA。

  • 当用户登录服务器注册信息时,用户的加密设备产生一对非对称密钥对,私钥在加密设备中保留,黑客无法读取,公钥传给服务器,服务器将此公钥和用户对应的账户相关联。
  • 当用户登录服务器验证信息时,用户使用设备中的私钥对服务器的挑战数据做签名,服务器使用对应的公钥做验证。用户的设备中的私钥,必须经过用户解锁(如按键,按下指纹等),才能被用来做签名操作

U2F协议

  1. U2F注册

    1. 用户在网站上注册,输入用户名和密码,提交给服务器。

    2. 服务器组织注册数据

      Registration Data {
              DOMString Version;//
              DOMString challenge;//
              DOMString app_id;//
              DOMString sessionId;//
      }
      
    3. 浏览器组织注册数据,给U2F设备发送注册指令,注册数据为SHA2(Client Data) + SHA2(app_id)。

      Client Data {           
              DOMString typ;//
              DOMString challenge;//
              DOMString origin;//
              DOMString or JwKey cid_pubkey//
      }
      
    4. U2F设备产生一对密钥对,用私钥对SHA2(Client Data) + SHA2(app_id) 做签名, 返回的数据:公钥+Key Handle+X509证书+签名值。

    5. 浏览器将U2F返回的值,Client Data等信息传给服务器。

    6. 服务器验证证书有效性,使用对应的公钥做验签操作,验签成功,服务器将账户信息和公钥,Key Handle等信息关联在一起,组织签名数据.

      Sign Data {                                               
          DOMString Version;    
          DOMString challenge;
          DOMString app_id;
          DOMString keyHandle;
          DOMString sessionId;
      }
      
  2. U2F登录

    1. 用户输入用户名,点击”登陆”,提交给服务器。

    2. 服务器组织认证数据Sign Data{}。

    3. 组织认证数据,给U2F发送认证指令。主要认证数据为:

      SHA2(Client Data) + SHA2(app_id)+Key Handle

    4. U2F设备验证Key Handle是否存在设备中,Key Handle和 application id 是否匹配。如果验证成功,通过Key Handle对应的私钥对指定数据做签名,对应密钥对的引用计数器加一,返回值中数据包括引用计数和签名值。

    5. 浏览器将U2F返回的值,Client Data等信息传给服务器。

    6. 服务器验证引用计数,判断设备是否被克隆,验证Client Data数据合法性,组织签名数据,使用对应的公钥做验签操作,验签成功,服务器将账户的引用计数更新为最新的引用计数。服务器允许用户登录

U2F设备要求

  1. 私钥保护:U2F的设备允许是一个低廉的设备,但必须能保证密钥的安全。Key Handle可以不是U2F设备上一个私钥的索引,相反,Key Handle可以用来存储私钥和服务器相关信息,这些信息可以被加密保存到一个Key Handle中。(例如使用AES加密私钥和服务器信息)。

  2. 可验证真伪:服务器需要一种方式,来确定用户使用的设别是服务器所授权和允许使用的,这里使用的证书体系。

  3. 防止设备克隆:U2F协议中,使用了计数器。在用户注册完设备后,服务器会初始化计数器(从0开始),设备内部,对应的密钥对也有一个计数器。用户每验证一次,设备内计数器加一,此计数会传给服务器,服务器比对服务器上的计数器和设备的计数器,如果服务器的计数器小于等于设备的计数器,属于正常操作,服务器验证成功后,将计数器更新为设备当前的计数器。如果服务器的计数器大于设备的计数器,说明U2F设备已被克隆。例如,用户注册完一次后,并登陆,服务器的计数器更新为1,U2F设备也为1.下次用户再次登陆,服务器和设备都跟新为2. 如果U2F设备被克隆,其它人使用该设备登陆,服务器计数器会随着恶意使用者的登陆,计数器会递增。假设,恶意用户登陆了两次,服务器的技术则为4。当真正的用户登陆时,它的计数器加1,变为3,传给服务器。服务器发现它的计数比服务器上的小,服务器就会给用户发出警告信息,警告用户设备已被克隆。但这种技术有个滞后的弊端,如果用户不再登陆,或者很长时间都没有登陆,用户是无法发现被克隆的。即便是很快发现了,估计也为时已晚,黑客不可能等你发现了再去窃取你的隐私。

使用流程

当用户需要使用U2F做验证操作时,服务器产生挑战数据,使用U2F设备做签名,此时服务器将Key Handle和服务器信息通过浏览器传给U2F设备,U2F设备使用Key Handle,寻找对应的密钥对,如果密钥对存在,检验密钥对应的服务器信息是否和传入的服务器信息匹配,如果不匹配,说明服务器是伪造或者不正确的。如果正确,U2F设备等待用户按键确认,用户按键后,U2F设备对挑战数据做签名,签名值返回给服务器,服务器验证签名值,如果签名正确,说明此公钥对应的唯一私钥是正确的,表面用户拥有合法U2F设备,如果签名不正确,说明此用户正在伪造身份登录。可见,U2F验证身份是双向的,U2F验证服务器的真伪,服务器验证U2F的真假。

WebAuthn

WebAuthn 标准是 FIDO 联盟指导下的 FIDO2 项目的核心组成部分。在 WebAuthn 标准下,网站和应用程序能够调用用户设备上的身份认证器,直接使用指纹识别、面部识别、虹膜识别、声音识别等方式对用户身份进行验证。由于这些用户信息都是保存在用户设备本地的,不会发送到应用或网站后台上。

注册流程

  • user:准备进行注册或登录的用户。

  • client:网页或者应用

  • server:实现WebAuth标准的服务提供方,网页或应用的后端。

  • Authenticator:指纹识别、面部识别等用户设备上的身份认证模块,负责对用户的身份进行验证。

0.client请求注册,将请求数据发送给server。

  1. server生成challenge以及其他必要信息,返回给client。

  2. client收到消息后,将challenge、server信息、user信息发送给Authenticator,并提示用户进行验证。

  3. Authenticator验证用户身份,验证成功后生成一对公钥-私钥,存储私钥、用户信息以及请求登录的域名。之后,Authenticator使用私钥对challenge进行签名。

  4. Authenticator将签名、公钥、加密算法、加密数据等数据发送给client。

  5. client将Authenticator的数据发送给server。

  6. server使用公钥验证签名,如果challenge一致的话,存储公钥及用户信息,完整注册。

登录流程

0.client向server发送登录请求。

  1. server生成challenge以及其他必要信息,返回给client。

  2. client将challenge、server信息及user信息发送给Authenticator。

  3. Authenticator根据user信息和server信息查找之前存储的私钥,用私钥对challenge进行签名,返回给client。

  4. client将签名后的数据发送给server。

  5. server接收到数据后,使用存储的公钥进行解密,解密出来的challenge一致的话,则验证通过。

特点

对用户来说,真正做到了无密码。

基于FIDO标准的应用

Google密钥管理工具

Google密码管理器的主要功能之一是安全的存储密码,用户可以直接在Google账户中保存登录凭据,无需记住多个用户名和密码。

功能

  • 提供自动填充的功能,可以减少手动输入的时间。

  • 包含密码生成功能,可以为不用的网站和平台创建强大的、独特的密码。

  • 提供安全检查功能,可帮助用户识别弱密码或受损密码。

查看密码

使用了Windows提供的API,只要登录了自己的windows账号,就可以查看密码。

安全性

由于Windows账户密码是一个常量,并不是只有Chrome才能读取“主密码”,其他外部工具也能获取加密数据,同样也可以解密加密数据。用ChromePass工具就可以读取密码。

根据软件的提示,找到了Google存储密码的文件Login Data。打开后发现为密文数据,加密密钥为windows账号密码。

换了个windows账号,设置了不同的登录密码。再用ChromePass工具读取密码时,发现读不到了。

所以,Google的密钥管理工具并不安全。

Microsoft 电子钱包

与Google相同。

Passkey

苹果在2022年的WWDC大会上宣布了在iOS设备上可以使用一种名叫Passkey的无密码登录,苹果把它翻译成“通行密钥”,并随后又在macOS上支持它。谷歌和微软随后也宣布在Android和Windows系统上支持通行密钥。

Passkey与前面的密钥管理工具一样,都是贯彻无密码的体系,Google和Microsoft的密码管理工具在使用上,只是帮助填充密码,省去了输入密码的步骤,所以我认为并不能认为是无密码,而是少密码。而Passkeys是基于WebAuthn标准的。

Passkey原理

Passkey的核心技术就是使用非对称密钥,通过签名完成认证的。

在使用Passkey登录时,网站存储了用户的公钥,而私钥存储在本地设备。通过给服务器发送私钥签名,服务器验证签名无误,即登录成功。

Passkey使用过程

拿谷歌来举例。

从上图能够看到,谷歌可以选择两种登录方式,一种传统的密码,一种是passkey。

  1. 首先需要先注册一个passkey。

  1. 与windows账号相关联后,passkey就创建完成了。

  2. 有了passkey,可以直接使用passkey进行登录,在验证windows账号后,成功登录google账号。

华为密码保险箱

###

文档信息

Search

    Table of Contents