作者: hetao

  • RSA加密/签名模式(填充方式)

    填充是PKCS#1的主要内容,占了正文三分之二的篇幅
    早期的填充方式称为RSA-PKCS#1 v1.5填充,这种填充方式只是生成一个随机数与明文连接在一起,相对不安全,后来在RSA-PKCS#1 v2.1中(也就是RFC3447)定义了OAEP(用于加密)和PSS(用于签名)两种填充方式,新的填充方式使用MGF基于随机数对明文进行掩码处理。建议使用OAEP和PSS填充而不是RSA-PKCS#1 v1.5填充。

    MGF: 掩码生成函数

    https://datatracker.ietf.org/doc/rfc8017/
    RSA-PKCS#1 v2.2
    https://datatracker.ietf.org/doc/rfc3447/
    RSA-PKCS#1 v2.1

    Views: 35

  • Diffie-Hellman密钥交换与Dragonfly密钥交换

    • DH用于匿名的双方生成临时密钥,后面会用其它协议进行身份认证
    • Dragonfly在生成临时密钥的同时完成身份认证,若生成的密钥相同则认证通过
    • DH只需要1次报文交换(各自发送1个报文)来生成共享密钥
    • Dragonfly需要2次报文交换,第一次交换生成共享密钥,第二次交换验证密钥是否相同(交换密钥的Hash)
    • DH需要发起方在第一次密钥交换的时候生成公私钥对,并把公钥分发给对方,后续只交换随机数不再交公钥
    • Dragonfly双方各自基于预共享密钥和随机数生成PWE,并把PWE和随机数发送给对方
    • WPA3中使用Dragonfly,又叫SAE
    • TLS和IPsec使用DH,ECDH,ED25519


    SAE密钥交换示意图,PWE不是明文传输的,而是用u进行了掩码处理,就是mask_u,不过这个mask_u应该是直接参与运算而不需要去掩码的。


    DH密钥交换示意图,其中g和p是公钥,A和B是公开的随机数,K是共享密钥

    参考:
    https://blog.csdn.net/weixin_47877869/article/details/136711988

    Views: 4

  • PKCS与X.509

    PKCS#7(RFC2315)描述了Data(明文),Signed-data(签名), Enveloped-data(数字信封)signedAndEnvelopedData, digestedData, and encryptedData六种数据结构,并用PEM格式存储。定义了如何对数据进行签名和加密并进行存储的方法。在Windows上可以用PKCS#7来存储证书,它是通过无正文数据的Signed-data来存储证书的(后缀名为.p7b,事实上PKCS#7中data正文是必选的,证书是可选的),因为PKCS#7设计并不是专门用来存储证书的,这样存储蛮奇怪的而且不符合标准。

    关于对证书的定义PKCS#12标准(RFC7292)的原话是:A digitally signed data unit binding a public key to identity information.

    我的理解证书就是将身份信息用私钥进行签名,并把签名和公钥绑定在一起的数据单元(PKCS#12把存储的一个个数据对象称为PDU)。PKCS#7中的Signed-data包含了身份信息(虽然没有X.509中的身份信息详尽)和签名,但是没有包含公钥,所以不能称为证书。

    PKCS#12定义了KeyBag,PKCS8ShroudedKeyBag,CertBag,CRLBag,SecretBag,SafeContents一共6种PDU类型和Data,EncryptedData,EnvelopedData三种PDU加密方式,但是仍然不包含公钥(虽然可以把证书文件塞进去作为CertBag)。PKCS#12是一个复合容器(keystore),可以存储多种不同类型的密钥和证书,并且可以对PDU进行加密和完整性验证。属于一种keystore,PKCS#12不用来存储用户数据。

    按照PKCS#12和PKCS#8中的要求虽然KeyBag,PKCS8ShroudedKeyBag只用来存储单个私钥,是不能包含公钥的(虽然私钥可以导出公钥)。

    PKCS虽然涵盖了PKI的方方面面,但是唯独没有定义证书的格式,只有X.509同时包含了身份信息,公钥,签名三种信息,符合证书的定义。

    以上,只有X.509证书的说法,没有PKCS格式证书的说法,X.509证书可以保存在PKCS#12证书容器中。X.509与PKCS的大多数规范并没有太大关系,反而PKCS#7中的Signed data可以使用X.509证书,只有PKCS#1中定义的公私钥存储格式和RSA加密/签名操作规范在X.509中有所体现。

    https://lapo.it/asn1js/
    asn.1解码器,可以解码PKCS和X.509编码的文件

    Views: 11

  • Fast BSS Transition(802.11r)

    • 密钥层次
      80211r的重点是三层密钥模型
      WLAN Controller : PMK-R0 key holder (R0KH)
      Access Point : PMK-R1 key holder (R1KH)
      Client Station : PMK-S0 key holder (S0KH)
      Client Station : PMK-S1 key holder (S1KH)

    802.11r defines a three-level key hierarcy
    1. Pairwise Master Key R0(PMK-R0) : The first level key of the FT key hierarchy. This key is derived from master session key (MSK)
    2. Pairwise Master key R1(PMK-R1) : The second level key of the FT key hierarchy.
    3. Pairwise Transit Key (PTK) : The third-level key of the FT key hierarchy. The PTK is the final key used to encrypt 802.11 data frames.

    PMK-R0属于属于第一层,PMK-R1属于第二层,PMK属于第三层,S0和S1是PMK-R0和PMK-R1在STA上的对应体现。
    – 首次连接

    – Over-the-Air Fast BSS Transition

    – Over-the-DS Fast BSS Transition

    带Resource Request,多了一对握手包

    参考:
    https://www.cwnp.com/uploads/802-11_rsn_ft.pdf

    CWSP-802.11r Key Hierarchy

    Views: 9

  • WPA2四次握手和KRACK

    • 密钥层次
    • 握手过程

      握手过程是通过EAPOL报文封装的,也可以称为EAPOL握手。
    • 完整的连接过程
    • KRACK

      诱导AP重发Message3报文可以让STA重装PTK密钥,重装密钥的同时初始化向量会重新计数,造成加密密钥重复使用。
      在STA上重装相同的密钥并不是802.11规定的,是认证客户端在实现的时候(wpa_supplicant2.4以下版本)没有意思到密钥重装会带来安全问题,当然802.11也没有提醒这一点。
      KRACK解决方法:
    • 在STA上一次EAPOL握手只允许安装一次PTK密钥,禁止密钥重装
    • STA安装密钥时判断与现有密钥是否相同,相同则忽略当前密钥安装
    • 禁止或限制AP重发Message 3报文
      完全禁止重发Message 3会对连接稳定性造成影响,目前一般是在AP上限制重发次数(通常是3或4次)并在 STA上禁止密钥重装。
      Openwrt或hostapd上有一个禁止重发Message1和Message3报文的配置
    # Workaround for key reinstallation attacks
    #
    # This parameter can be used to disable retransmission of EAPOL-Key frames that
    # are used to install keys (EAPOL-Key message 3/4 and group message 1/2). This
    # is similar to setting wpa_group_update_count=1 and
    # wpa_pairwise_update_count=1, but with no impact to message 1/4 and with
    # extended timeout on the response to avoid causing issues with stations that
    # may use aggressive power saving have very long time in replying to the
    # EAPOL-Key messages.
    #
    # This option can be used to work around key reinstallation attacks on the
    # station (supplicant) side in cases those station devices cannot be updated
    # for some reason. By removing the retransmissions the attacker cannot cause
    # key reinstallation with a delayed frame transmission. This is related to the
    # station side vulnerabilities CVE-2017-13077, CVE-2017-13078, CVE-2017-13079,
    # CVE-2017-13080, and CVE-2017-13081.
    #
    # This workaround might cause interoperability issues and reduced robustness of
    # key negotiation especially in environments with heavy traffic load due to the
    # number of attempts to perform the key exchange is reduced significantly. As
    # such, this workaround is disabled by default (unless overridden in build
    # configuration). To enable this, set the parameter to 1.
    #wpa_disable_eapol_key_retries=1
    

    Views: 9

  • WPA3的AKM套件和SAE-PK验证

    AKM

    AKM英文是Authentication and Key Management,在WPA中指的是认证和密钥交换及各种子密钥派生方法。
    WPA3中的AKM主要分为企业模式,个人模式,Only模式,过渡模式。
    SAE就是普通的WPA3-SAE模式,WPA3-Personal用的就是这个模式,SAE又分为SAE,SAE-GDH
    SAE用的是Hunting and Pecking算法把PSK映射到ECC上的点,这种算法已被证明存在安全隐患,所以后面又推出了H2E算法,H2E就是Hash to Element,也就是Hash算法。
    Hunting and Pecking的AKM编码是AKM8,Hash to Element的AKM编码是AKM24。6GHz频段要求仅支持AKM24。
    也以客户端提供对H2E的支持:
    – Android 12+
    – Linux wpa_supplicant v2.10+ (see sae_pwe parameter for configuration)
    – macOS Catalina+
    – Windows 10 21H2+
    下图是一部分AKM套件的编号
    akm套件

    SAE-PK

    基于非对称密钥的SAE,先生成一个P-256的密钥对,然后算出来一个M值,M值参与生成签名,加入M值可以让签名的前sec个字节为0(抗第二原像攻击,防止找出第2个与指纹密码相同的公钥)。然后对公钥进行Hash运行,取前12位(最少12位,长度可以是4的倍数)作为wifi密码。在SAE握手的时候AP会把M值,随机数,Mac地址等一起进行签名,生成一个签名指纹。
    AP会把公钥,签名,KEK加密的M值一起发送给STA,STA用密码对公钥进行验证,如果验证通过再用公钥验签(用于生成签名的输入是双方共享的),验签通过就是合法的AP。
    这里不直接用公钥作为密码应该是因为公钥太长了,所以才对公钥进行Hash作为密码。
    SAE-PK密码是这样的:

    wsie-tyg2-x2rl-qsfs
    wsie-tyg2-x2rl-qsfl-y2mr
    wsie-tyg2-x2rl-qsfl-y2mc-t5yi
    wsie-tyg2-x2rl-qsfl-y2mc-t5ye-rvc6
    wsie-tyg2-x2rl-qsfl-y2mc-t5ye-rvcg-tr6e
    wsie-tyg2-x2rl-qsfl-y2mc-t5ye-rvcg-tr65-5dhj
    wsie-tyg2-x2rl-qsfl-y2mc-t5ye-rvcg-tr65-5dhu-touh
    wsie-tyg2-x2rl-qsfl-y2mc-t5ye-rvcg-tr65-5dhu-touh-4sdz
    wsie-tyg2-x2rl-qsfl-y2mc-t5ye-rvcg-tr65-5dhu-touh-4sdl-2mpz

    SAE-PK密码同时作为普通的SAE密码使用,这样如果STA不支持SAE-PK则按普通SAE验证。也可以使用SAE-PK Only模式以抵抗降级攻击。
    这个表是不同的凭据参数抗第二原像攻击的强度

    其中A是密码长度,Sec是Hash安全参数长度,S是破解所需计算量的数量级。Nvidia最新的GB200算力平台算力是720 PH/sec,破解76数量级的Hash只需要十几天。虽然Sec越长安全性越高,但是找到合适M值 的难度也更高。
    如果STA已经信任AP的公钥(已经验证过或通过扫描识别),则不存在第二原像攻击。

    Views: 11

  • WEP加密协议

    在Wi-Fi中,WEP(Wired Equivalent Privacy)是一种早期的加密协议,用于保护无线网络通信的安全性。WEP的含义是提供与有线网络相当的安全性,1997年随第一代802.11协议推出。
    WEP使用RC4加密,可以提供无线流量的加密,认证,完整性保护。
    WEBP的密码是直接当密钥用的,不会做PRF处理。
    目前常用的wep加密长度有:
    1. 64-bit WEP: 其中密码长度为40位,也就是(40/8=)5个ASCII码。
    2. 128-bit WEP:其中密码长度为104位,也就是(104/8=)13个ASCII码。
    剩下的24bit就是IV(初始化向量),IV+Shared Key就是RC4的密钥。
    802.11并没有规定IV的生成方式,只是规定IV不能重复,所以最好的方法无非是序列号。

    WEP加密下的帧格式包括以下几个部分:

    WEP帧格式

    1. MAC Header:包含帧控制、地址和序列控制信息。
    2. IV(Initialization Vector):初始化向量,用于加密过程中的随机化。
    3. 加密数据:实际的加密数据负载。
    4. ICV(Integrity Check Value):完整性校验值,用于验证数据的完整性。

    详细结构

    +------------------+------------------+------------------+------------------+
    |    MAC Header    |        IV        |   Encrypted Data |        ICV       |
    +------------------+------------------+------------------+------------------+
    

    1. MAC Header

    • Frame Control:2字节,包含帧类型和控制信息。
    • Duration/ID:2字节,包含持续时间或ID信息。
    • Address 1:6字节,目的地址。
    • Address 2:6字节,源地址。
    • Address 3:6字节,BSSID(基本服务集标识符)。
    • Sequence Control:2字节,包含序列号和片段号。
    • Address 4(可选):6字节,用于WDS(无线分布系统)。

    2. IV(Initialization Vector)

    • IV:3字节,用于加密过程中的随机化。
    • Key ID:1字节,指示使用的WEP密钥。

    3. Encrypted Data

    • 加密数据:实际的加密数据负载,使用RC4算法加密。

    4. ICV(Integrity Check Value)

    • ICV:4字节,用于验证数据的完整性。

    示例

    以下是一个WEP加密帧的示例:

    +------------------+------------------+------------------+------------------+
    |    MAC Header    |        IV        |   Encrypted Data |        ICV       |
    +------------------+------------------+------------------+------------------+
    | Frame Control    | IV (3 bytes)     | Encrypted Data   | ICV (4 bytes)    |
    | Duration/ID      | Key ID (1 byte)  | (variable length)|                  |
    | Address 1        |                  |                  |                  |
    | Address 2        |                  |                  |                  |
    | Address 3        |                  |                  |                  |
    | Sequence Control |                  |                  |                  |
    | Address 4 (opt.) |                  |                  |                  |
    +------------------+------------------+------------------+------------------+
    

    总结

    WEP加密下的Wi-Fi帧格式包括MAC Header、IV、加密数据和ICV。IV用于加密过程中的随机化,ICV用于验证数据的完整性。WEP使用RC4算法进行加密,但由于其安全性较弱,已经被更安全的协议(如WPA和WPA2)所取代。
    WEP的主要问题是密钥不变而且无法防重放攻击,这样通过重放攻击制造大量报文,然后收集到足够的报文后再利用RC4的弱点就可以破解了。

    Views: 7

  • Challenge/Response

    中文叫挑战/应答或质询/应答,是一种身份认证方式,具体流程为:
    1. 客户向认证服务器发出请求,要求进行身份认证;
    3. 认证服务器内部产生一个随机数,作为”质询值”,发送给客户;
    4. 客户把质询值用预先配置的密码进行RC4加密作为应答;
    5. 认证服务器将应答串与自己的计算结果比较,若二者相同,则通过一次认证;否则,认证失败;
    6. 认证服务器通知客户认证成功或失败。

    因为质询值是明文发送的,所以存在安全隐患。

    Views: 10

  • IV(Initialization Vector)和Nonce

    因为使用同一个密码多次加密报文会降低加密数据的安全性,所以每个加密块都会使用唯一的密码加密。通常做法是用一个随机数或序列号或时间戳与密钥进行混合生成子密钥来加密数据。
    如初始化向量是按特定规则生成的也可以称为nonce。
    实际上复杂一点的情况初始化向量是由随机数和序列号,时间戳等共同组成的,可以是从左到右串起来,也可以是经过一定的运算。初始化向量中的随机数称为salt,比如AES-GCM中通常是4字节的Salt再加8字节的序列号。
    根据TLS和IPsec中的定义初始化向量一般是12个字节组成,前4个是固定的salt,后8个是序列号。
    在IPsec中Salt是在SA协商时生成的,在一个SA中不会改变,在TLS中Salt是在会话协商时生成的,在一个会话中不会改变。
    因为解密的时候也需要IV,所以在不可靠连接(IPSec,DTLS,Wireguard,Wifi的WEP和WPA)加密时,IV都要附在密文前面一起发给对方。因为salt通常是固定的也可以也可以不在报文中发送,虽然序列号是可预测的,但是为了防止丢包(丢包后序列号就对不上了),在不可靠连接报文中发送IV仍然是必须的。
    为了避免IV回绕可以执行密钥更新协议定时更新密钥。
    以上只是一般做法,不同的算法和应用中IV的长度,生成方法,发送方式都会不同。

    Views: 18

  • TLS1.3和QuicTLS中的密钥更新

    在IPSec中定期执行密钥更新是强制性的,比如华为防火墙上是每个小时或者每超过80GB流量就会更新一次SA。

    但是TLS中并没有对密钥更新进行硬性规定,可能因为TLS通常用于短连接,对之方面要求低。TLS1.2及以前可以通过重协商(重新握手)来更换密钥,但这可能造成连接中断。TLS1.3中提供了专门的key update所握手消息进行密钥更新,但并没有规定密钥更新周期。

    在RFC8446的5.5节提到对于一组密钥,AES-GCM可以对2400万个TLS记录进行安全的加密,一个TLS记录是16KB,也就是384GB的数据大小。看来日常环境中TLS并没有更新密钥的必要性,在nginx,firefox,chrome中我也没有发现有密钥更新的说明或相关配置。
    在OpenVPN上可以使用–reneg-bytes和reneg-sec配置更新密钥的数据量和时间周期。不过OpenVPN并没有使用TLS的密钥更新机掉,OpenVPN自己实现了密钥管理,密钥交换,密钥重协商等,需要注意的是,它并不使用SSL握手最终确定的那些密钥,OpenVPN使用SSL握手仅仅是完成了连接者身份认证以及为后续的密钥管理,密钥交换,密钥交换以及控制信道构建一个安全的加密通道,完全类似于IKE的第一阶段协商。

    另外在这个IETF提案中提到TLS1.3中自带的key update机制不是PFS(前向保密),所以重新定义了一个用于密钥更新的扩展,用于提供PFS的密钥更新。
    在OpenSSL中可以调用SSL_key_update()函数执行TLS1.3的key update握手。

    在QuicTLS(RFC9001)中对密钥更新做了更明确也更严格的要求,AES-123-GCM限制为2^23个数据包,1个数据包是1.5KB的话就是12GB的数据量。而且超过数据量后必须更新密钥或中断连接。Quic专门定义了一个key_updated事件,在密钥更新时会触发。QuicTLS并没有使用TLS1.3中的key update报文来更新密钥,而是使用Key Phase bit来进行密钥更新,而且QuicTLS要求两端同时进行密钥更新。在OpenSSL的ssl/quic/quic_record_util.c文件中定义了每种加密套件的AEAD用量限制,共定义了3种加客套件,分别由suite_aes128gcm,suite_aes256gcm,suite_chacha20poly1305这3个结构体表示。

    参考:
    https://datatracker.ietf.org/doc/draft-irtf-cfrg-aead-limits/
    https://datatracker.ietf.org/doc/html/rfc8446
    https://datatracker.ietf.org/doc/draft-ietf-tls-extended-key-update/
    http://shanks.link/blog/2022/07/01/openvpn%E5%8D%8F%E8%AE%AE%E8%A7%A3%E6%9E%90%E4%B9%8B%E7%BD%91%E7%BB%9C%E7%BB%93%E6%9E%84%E4%B9%8B%E5%A4%96/
    https://docs.openssl.org/master/man3/SSL_key_update/
    https://caddyserver.com/docs/json/apps/http/servers/tls_connection_policies/client_authentication/ca/http/tls/renegotiation/
    https://datatracker.ietf.org/doc/draft-ietf-quic-qlog-quic-events/
    https://autumnquiche.github.io/RFC9001_Chinese_Simplified/#6.6_Limits_on_AEAD_Usage
    https://dev.to/shouhua_57/http3zhi-key-update-nod

    Views: 9