算法,  计算机,  面试

The Principle and Application of Encryption and Encode

概念

公钥私钥

公钥加密和私钥解密是非对称加密系统的核心特征之一,其实现基于复杂数学原理和计算问题。以下是这一过程的简化解释:

基础原理

非对称加密依赖于数学上的“单向函数”。这些函数易于进行一个方向的运算(比如乘法),但在没有特定信息(比如因子分解)的情况下难以逆向运算(比如从乘积中分解原始的数)。在非对称加密中,这种单向函数使得用公钥加密的信息只能用对应的私钥解密,反之亦然。

加密过程

  1. 生成密钥对:首先生成一对密钥,即公钥和私钥。这两个密钥在数学上是相关联的,但从一个密钥推导出另一个密钥是非常困难的。
  2. 公钥加密:任何人都可以使用公钥对信息进行加密。加密过程涉及复杂的数学运算,这些运算使用公钥和要加密的信息作为输入。

解密过程

  1. 私钥解密:只有持有对应私钥的人才能解密用公钥加密的信息。解密过程同样涉及一系列复杂的数学运算,这些运算使用私钥和加密的信息作为输入。
  2. 私钥独有:由于从公钥中推导出私钥几乎不可能,因此只有私钥的持有者能够解密信息。

公钥加密

  • 用途:公钥通常用于加密数据。任何人都可以使用公钥来加密信息,但只有拥有对应私钥的接收方才能解密这些信息。
  • 目标:保证信息的保密性。例如,如果你想安全地发送信息给某人,你可以使用他们的公钥加密信息。

私钥加密

  • 用途:私钥也可以用于加密,但这主要用于创建数字签名。当使用私钥加密信息(或更常见的是信息的数字摘要)时,任何人都可以使用相应的公钥来解密和验证签名。
  • 目标:确保信息的真实性和来源的不可否认性。例如,发送方可以使用其私钥来签名消息,接收方则可以用发送方的公钥验证签名的真实性。

加密与解密的原则

  • 公钥加密,私钥解密:这是最常见的场景,用于保密信息传输。只有私钥持有者才能解密用公钥加密的信息。
  • 私钥加密(签名),公钥验证:这主要用于数字签名,以证明信息的来源并确保其未被篡改。

重要性

  • 安全性:私钥必须始终保密,而公钥则可以安全地公开。
  • 应用场景:在不同的应用场景中,这两种密钥的使用方式提供了数据传输的安全性和数据真实性的保障。

总结来说,虽然公钥和私钥在技术上都可以用于加密,但它们在实际应用中的主要用途是不同的:公钥主要用于加密数据以保护隐私,而私钥主要用于创建数字签名以验证身份和数据的完整性。

哈希

特点

1、根据任意长度的消息计算出固定长度的散列值;

2、能够快速计算出散列值;

3、消息不同(也就是输入不同)得到的散列值也不同;

4、具备单向性。单向性的意思是无法通过散列值推算出消息。

小知识:为什么Bitcoin中的hash要算两次?

(Salt)

(Salt),在密码学中,是指在散列之前将散列内容(例如:密码)的任意固定位置插入特定的字符串。这个在散列中加入字符串的方式称为“加盐”。其作用是让加盐后的散列结果和没有加盐的结果不相同,在不同的应用情景中,这个处理可以增加额外的安全性。

彩虹表

彩虹表是一个用于加密散列函数逆运算的预先计算好的,常用于破解加密过的密码散列。 彩虹表常常用于破解长度固定且包含的字符范围固定的密码(如信用卡、数字等)。这是以空间换时间的典型实践,比暴力破解(Brute-force attack)使用的时间更少,空间更多;但与储存密码空间中的每一个密码及其对应的哈希值(Hash)实现的查找表相比,其花费的时间更多,空间更少。使用加盐密钥派生函数可以使这种攻击难以实现。

fingerprint 指纹

在密码学中,”fingerprint” 通常指的是一个较短的数据串,它是从更长的数据(如公钥或文件)通过某种算法(通常是哈希函数)产生的。它的目的是为了提供一个简短而独特的表示形式,用于快速识别、比较或验证原始数据。

以下是一些常见的应用场景:

  1. 公钥的指纹:例如,SSH和PGP都为公钥生成指纹。当你想要添加一个新的远程主机到你的SSH信任列表时,SSH会显示该主机的公钥指纹,以供你验证。这样,你可以通过其他渠道(例如电话或短信)与远程主机的管理员确认这个指纹,确保你不是被中间人攻击。
  2. 文件的指纹:通过对文件内容使用哈希函数,可以得到该文件的指纹。这是一种常见的方法,用于快速检查文件是否被修改或损坏。例如,很多软件下载网站都会提供文件的MD5或SHA-256指纹,这样用户在下载文件后可以验证其完整性。
  3. 证书的指纹:在TLS/SSL通信中,为了验证服务器或客户端的证书,可以使用该证书的指纹。大多数浏览器都提供了一种查看网站SSL证书指纹的方法。

值得注意的是,为了确保安全性,指纹通常使用密码学上安全的哈希函数(如SHA-256)生成。这确保了即使原始数据发生微小变化,其指纹也会发生很大的变化,而且从指纹逆向推导原始数据的难度非常大。

哈希

sha256

应用场景:

数据校验:下载的时候MD5用于校验下载的完整性。

唯一标识:白名单验证邮箱的时候出于policy的要求,传输的是hash之后的值。

hash碰撞率计算 泰勒公式

P2PKH

Pay-to-PubKey-Hash is the basic form of making a transaction and is the most common form of transaction on the Bitcoin network. Transactions that pay to a Bitcoin address contain P2PKH scripts that are resolved by sending the public key and a digital signature created by the corresponding private key.

ScriptPubKey= OP_DUP OP_HASH160 <Public KeyHash> OP_EQUAL OP_CHECKSIG
ScriptSig= <Signature> <Public Key>

Checking process:
我的理解:对签名和公钥依次执行这个操作:DUP公钥 hash160 结果与公钥hash比较 然后比较栈顶

MurmurHash

MurmurHash 是一种非加密型哈希函数,它以高效率和良好的哈希性能而著称。这种哈希算法最初由 Austin Appleby 在 2008 年开发,目的是作为一个低碰撞率的哈希算法,适用于一般的哈希基础应用。

MurmurHash 的特点:

  1. 高性能
    • MurmurHash 的计算速度非常快,特别是在处理大量数据时,相较于其他常见的哈希算法(如 MD5, SHA-1)速度更快。
  2. 低碰撞率
    • 在哈希算法中,“碰撞”指的是两个不同的输入值返回相同的哈希值。MurmurHash 设计时就考虑了尽可能降低碰撞率,这使得它在散列表和查找结构中表现出色。
  3. 平台无关性
    • MurmurHash 保持对多平台的支持,无论是在 32 位还是 64 位系统上都能保持一致的性能和结果。
  4. 不适合加密
    • 由于 MurmurHash 算法没有考虑抵抗故意的碰撞攻击,因此不适用于需要加密安全性的应用。它更适合作为数据分布、负载均衡、随机性生成等场合的哈希函数。

应用场景:

  • 数据存储:在构建哈希表时,用于快速数据查找和插入。
  • 分布式系统:生成一致性哈希值,用于数据分片和负载均衡。
  • 数据缓存:提供快速的键值匹配,用于缓存机制。
  • 随机数生成:用作生成随机数种子的基础。

编码

base64

一种编码方式,将二进制数据在 radix-64 后用 ASCII 字符串的格式表示出来。无难点

MD5

签名。输入不定长度信息,输出固定长度128-bits的演算法。不可逆。

非对称加密

公钥负责加密,私钥负责解密私钥负责签名,公钥负责验证

签名

数字签名是一个带有密钥的消息摘要算法,这个密钥包括了公钥和私钥,用于验证数据完整性、认证数据来源和抗否认,遵循OSI参考模型、私钥签名和公钥验证。也是非对称加密算法和消息摘要算法的结合体。

数字摘要(Digital Digest)

  1. 定义:数字摘要是通过将数据(如文件、消息或文档)通过哈希算法处理后得到的一个小型、唯一的“指纹”或“摘要”。这个过程被称为哈希(Hashing)。
  2. 特点
    • 唯一性:即使是微小的数据变化也会产生完全不同的摘要。
    • 不可逆性:从摘要无法还原原始数据。
  3. 用途:主要用于验证数据的完整性。通过比较数据的当前摘要和先前计算的摘要,可以检查数据自那时起是否被更改。

数字签名(Digital Signature)

  1. 定义:数字签名是使用私钥对数据(或其摘要)进行加密的过程,它证明了数据是由特定的个人或实体发送的,并且自签名以来未被更改。
  2. 过程
    • 创建:首先生成数据的数字摘要,然后使用私钥对摘要进行加密。
    • 验证:接收方使用相应的公钥解密签名,然后生成数据的摘要以进行比较。
  3. 作用:确保数据的真实性、完整性和不可否认性。

它们之间的关系

  • 数字摘要是数字签名的基础:数字签名通常不是直接对整个数据进行加密,而是对数据的数字摘要进行加密。这样做提高了效率并确保了安全性。
  • 结合使用以验证数据:当接收方收到数据和其数字签名时,他们可以用相同的哈希算法生成数据的数字摘要,然后用发送方的公钥解密签名以获取摘要。如果两个摘要相匹配,就证明数据是真实的且未被篡改。

总结来说,数字摘要用于确保数据的完整性,而数字签名用于证明数据的真实来源和完整性。两者结合使用,在数字通信和数据保护中发挥着至关重要的作用。

CA 证书颁布机构

加密

PBKDF2

密钥扩展。一种加密算法,将加salt的数据计算hash,如此遍历成千上万次提高破解难度,生成的derived key可以用于后续的操作。

PBKDF2 applies a pseudorandom function, such as hash-based message authentication code (HMAC), to the input password or passphrase along with a salt value and repeats the process many times to produce a derived key, which can then be used as a cryptographic key in subsequent operations. The added computational work makes password cracking much more difficult, and is known as key stretching.

ECC 椭圆曲线加密

椭圆曲线就是一组被 y2=x3+ax+b 定义的点集。其性质是取一条直线上的三点(这条直线和椭圆曲线相交),他们的总和等于0。这三点可以定义一个群,点为私钥,相加得到公钥,而公钥不能推算出私钥。

ECDSA

Elliptic Curve Digital Signature Algorithm 参考 椭圆曲线签名方法

两个优点
1.在已知公钥的情况下,无法推导出该公钥对应的私钥。
2.可以通过某些方法来证明某人拥有一个公钥所对应的私钥,而此过程不会暴露关于私钥的任何信息。

ECDSA算法通过随机椭圆曲线方程的性质产生密钥,如Secp256k1。可以通过某些方法来证明某人拥有一个公钥所对应的私钥,而此过程不会暴露关于私钥的任何信息。

ECDSA不会对数据进行加密、或阻止别人看到或访问你的数据,它可以防止的是确保数据没有被篡改

Secp256k1

secp256k1 refers to the parameters of the elliptic curve used in Bitcoin’s public-key cryptography, and is defined in Standards for Efficient Cryptography (SEC) (Certicom Research, http://www.secg.org/sec2-v2.pdf). Currently Bitcoin uses secp256k1 with the ECDSA algorithm, though the same curve with the same public/private keys can be used in some other algorithms such as Schnorr.

Keccak256

Keccak 是一个密码哈希函数家族,其中的某些变种被选为 Secure Hash Algorithm 3 (SHA-3) 的标准,经过了美国国家标准与技术研究院(NIST)的公开评审和选择过程。

下面是关于 Keccak 和特别是其变种 Keccak256 的一些基础信息:

  1. 结构:Keccak 使用了一种名为“sponge construction”的结构。这种结构分为两个主要部分:一个是吸收输入数据的“吸收阶段”,另一个是产生输出散列的“挤压阶段”。
  2. Keccak256:这是 Keccak 家族中的一个特定版本,输出长度为 256 位(32 字节)。数字 “256” 指的是其输出的位长度。Keccak256 是 Ethereum 项目中使用的哈希函数,因此它在区块链领域得到了广泛的关注和使用。
  3. 安全性:Keccak 的设计经过了多年的公开评审和严格的密码学分析。SHA-3 的选择过程中,Keccak 被认为是一个非常安全的候选者,并且与以前的 SHA-2 系列相比具有不同的设计,因此即使 SHA-2 受到威胁,SHA-3 仍然是安全的。
  4. 应用:除了作为 SHA-3 的基础之外,Keccak 还在其他许多密码学应用中被使用,例如随机数生成、身份验证码(MAC)和其他。
  5. 效率:Keccak 在硬件和软件实现中都是高效的,这使得它在各种设备和应用中都非常实用。
  6. 与 SHA-2 的区别:尽管 Keccak 选为 SHA-3 的标准,但它的内部结构与前面的 SHA-2 系列大不相同,提供了一个完全不同的安全备份。

总的来说,Keccak256 是一个现代的、安全的哈希函数,已被广泛采纳在多种密码学和区块链应用中。

RSA 非对称加密

RSA属于公钥加密算法中的一个重要应用。RSA加密算法由五个部分组成:

  • 原文(Message):需要加密的信息,可以是数字、文字、视频、音频等,用 M 表示。
  • 密文(Ciphertext):加密后得到的信息,用 C 表示。
  • 公钥(Public Key)和私钥(Private Key),用 PU 和 PR 表示。
  • 加密算法(Encryption):若 E(x) 为加密算法,加密过程可以理解为 C=E(M)根据原文和加密算法得到密文。
  • 解密算法(Decryption):若 D(x) 为解密算法,解密过程可以理解为 M=D(C) 根据密文和解密算法得到原文。

假设Alice和Bob要在网上进行加密通信,他们要怎么应用RSA来加密和解密信息呢?步骤如下:

  1. 随机选择两个不相同的素数 p,q 。
  2. 将 p,q 相乘,记为 n=p×q 。
  3. 计算 n 的欧拉函数φ(n) ,欧拉函数证明,当 p,q 为不相同的素数时, φ(n)=(p−1)(q−1) 。
  4. 随机选择一个整数 e ,满足两个条件: φ(n) 与 e 互质,且 1<e<φ(n) 。
  5. 计算 e 对于 φ(n) 的模反元素 d ,也就是说找到一个 d 满足 ed=1 mod φ(n) 。这个式子等价于 ed−1=kφ(n) ,实际上就是对于方程 ed−kφ(n)=1 求 (d,k) 的整数解。这个方程可以用扩展欧几里得算法求解。
  6. 最终把 (e,n) 封装成公钥, (d,n) 封装成私钥。

SSL数字证书、代码签名证书、文档签名以及邮件签名大多都采用RSA算法进行加密。

AES加密

Advanced Encryption Standard,高级加密标准

看起来就是经过很多轮的计算和替换

HMAC 2

In cryptography, an HMAC (sometimes expanded as either keyed-hash message authentication code or hash-based message authentication code) is a specific type of message authentication code (MAC) involving a cryptographic hash function and a secret cryptographic key. As with any MAC, it may be used to simultaneously verify both the data integrity and authenticity of a message.

通过一个标准算法,在计算哈希的过程中,把key混入计算过程中,用于验证一段数据是否有效。如SHA-512。

SHA512

一种利用hash的加密算法

DSA

Digital Signature Algorithm,DSA只是一种算法,和RSA不同之处在于它不能用作加密和解密,也不能进行密钥交换,只用于签名,所以它比RSA要快很多,其安全性与RSA相比差不多。DSA的一个重要特点是两个素数公开,这样,当使用别人的p和q时,即使不知道私钥,你也能确认它们是否是随机产生的,还是作了手脚。RSA算法却做不到。

a. 发送方使用SHA-1和SHA-2编码将发送内容加密产生的数字摘要;
b. 发送方用自己的专用密钥对摘要进行再次加密得到数字签名;
c. 发送方将原文和加密后的摘要传给接收方;
d. 接收方使用发送方提供的密钥对进行解密 ,同时对收到的内容用SHA-1/SHA-2编码加密产生同样的摘要;
e. 接收方再将解密后的摘要和d步骤中加密产生的摘要进行比对,如果两者一至,则说明传输过程的信息没有被破坏和篡改,否则传输信息则不安全。

UUID

UUID 是 “Universally Unique Identifier” 的缩写,也常被称为 “GUID” (Globally Unique Identifier)。它是一个 128 位的数,通常由 32 个十六进制数字表示,并通过五组由连字符分隔的数字来展示(例如 550e8400-e29b-41d4-a716-446655440000)。

base::Uuid::GenerateRandomV4().AsLowercaseString()

以下是关于 UUID 的一些核心知识点:

  1. 版本:UUID 有几个版本,每个版本的生成方法不同。例如,V1 是基于时间和机器的 MAC 地址生成的,而 V4 是基于随机数生成的。
  2. 唯一性:虽然 UUID 不能保证全球唯一(特别是在 V4 中,因为它是随机生成的),但由于其大小和生成方法,它被认为在实际应用中是“几乎唯一”的。
  3. 无状态:UUID 可以在没有任何中心协调者的情况下生成,并且有很高的确定它是唯一的概率。
  4. 应用场景
    • 数据库的主键:尤其是在分布式系统中,使用 UUID 作为主键可以避免冲突。
    • 对象标识符:在需要标识对象但不想使用敏感信息的地方(如用户 ID)。
    • 临时文件名或目录名
    • 事务 ID:在日志记录、监控或跟踪请求时。
    • 在网络中的资源标识:例如,在 RESTful 服务中。
  5. 使用: 在您提供的代码中,base::Uuid::GenerateRandomV4() 似乎是一个函数调用,用于生成一个随机的 V4 UUID。AsLowercaseString() 方法可能是将此 UUID 转换为小写字符串形式。
  6. 注意事项
    • 尽管 UUID 是唯一的,但它不是短的。如果您的系统对存储或传输的大小很敏感,那么可能需要考虑其他解决方案。
    • UUID 不是按顺序生成的,这可能会对某些数据库系统产生不良影响,因为它可能导致不连续的磁盘写入。

总之,UUID 是一个强大和广泛使用的工具,用于在没有中心协调器的情况下生成唯一标识符。

TraceId

您提供的 CorrelationId 确实是一个 UUID。而 TraceId 似乎是一种分布式追踪格式,特别是与 W3C Trace Context 相关的格式。

让我们仔细看一下 TraceId
00-259c8b04537fd6590aa7a5b11da74983-7d3e47dd6f28ae6e-00

这种格式可以分为几个部分:

  1. 版本号:第一个 00 通常表示版本号。在此上下文中,它表示 W3C Trace Context 的版本。
  2. 追踪 ID (Trace ID)259c8b04537fd6590aa7a5b11da74983 似乎是追踪 ID,用于在整个分布式追踪中唯一标识一个请求。这是一个 32 位的十六进制值,与 UUID 相似,但格式略有不同。
  3. 父跨度 ID (Parent Span ID)7d3e47dd6f28ae6e 这部分是父跨度 ID,用于标识此追踪中的特定跨度(操作)的上一个跨度或操作。
  4. 标记:最后的 00 可能是一个标记,表示追踪的一些属性或状态。

分布式追踪(如 Zipkin、Jaeger 或 OpenTelemetry)用于监视、分析和调试分布式系统中的请求。在一个微服务架构中,一个请求可能会穿越多个服务。为了能够跟踪一个请求从哪里开始,到哪里结束,以及它在系统中经过了哪些服务,追踪 ID 和跨度 ID 被引入来帮助建立请求在系统中的路径。

总之,TraceId 是分布式追踪系统中用于追踪请求路径的标识符,而 CorrelationId/UUID 则通常用于其他系统和上下文中,以唯一标识某个特定的实体或请求。

应用

HTTPS

  1. 申请CA (Certification Authority)证书,如本网站的证书

证书包括两个文件,pem文件和key文件,表示公钥和私钥。

  1. 客户端解析证书并对其进行验证,从服务器证书中取出服务器的公钥A。
  2. 客户端会生成一个对称密钥,用公钥A加密后发送给服务器
  3. 服务器在收到随机码 KEY 之后会使用私钥B将其解密。
  4. 服务器使用密钥 (随机码 KEY)对数据进行对称加密并发送给客户端,客户端使用相同的密钥 (随机码 KEY)解密数据。
  5. 双方使用对称加密传输所有数据。

Azure Key Vault

  1. Keys (密钥)
    • 描述: 在 Azure Key Vault 中,密钥主要指的是加密和解密操作所使用的密钥。这些可以是对称密钥或非对称密钥对(公钥和私钥)。
    • 用途:
      • 加密和解密数据。
      • 数字签名和验证签名。
      • 使用非对称密钥在 Azure 中进行其他加密操作。
    • 注意事项: Key Vault 可以进行密钥的生成、存储、管理以及其他加密相关的操作,但不允许你直接访问私钥。你可以请求 Key Vault 执行一个加密或解密操作,而不是获取私钥自己来操作。
  2. Secrets (秘密)
    • 描述: 在 Azure Key Vault 中,秘密通常指的是你不希望暴露的任何其他信息,例如数据库连接字符串、API 密钥或其他应用程序配置。
    • 用途:
      • 存储和管理敏感的应用程序配置。
      • 存储 API 密钥、密码或其他凭证。
    • 注意事项: 虽然密钥用于加密操作,秘密实际上是明文存储在 Key Vault 中的(但被安全地保护)。
  3. Certificates (证书)
    • 描述: 在 Azure Key Vault 中,证书包括公钥、私钥以及与其相关的 X.509 元数据。Azure Key Vault 还可以与多个证书颁发机构 (CAs) 集成,自动处理证书的生命周期操作,如创建、续订和撤销。
    • 用途:
      • 用于 SSL/TLS 通信。
      • 用于身份验证和授权。
      • 代码签名。
    • 注意事项: 与 “keys” 类似,你不能直接访问存储在 Key Vault 中的证书的私钥部分。但你可以请求 Key Vault 执行与证书相关的操作。

简而言之,在 Azure Key Vault 的上下文中:

  • Keys 是用于加密的实际密钥。
  • Secrets 是其他类型的敏感信息,如密码或连接字符串。
  • Certificates 是包含公钥、私钥和相关元数据的证书对象。

CAS单点登录

单点登录就是多个系统,一次登录。比如baidu.com。只要你登录了baidu.com,百科、知道、经验、贴吧都会自动登录。

HTTP是无状态的协议,这意味着服务器无法确认用户的信息。于是就有了Cookie,cookie存在本地。Session存在服务器,依据Cookie来识别是否是同一个用户。单系统登录功能主要是用Session保存用户信息来实现的。而多系统的session是不共享的。

于是就有了SSO登录系统。其他子系统登录时,请求SSO(登录系统)进行登录,将返回的token写到Cookie中,下次访问时则把Cookie带上。

  • SSO系统生成一个token,并将用户信息存到Redis中,设置过期时间
  • 其他系统请求SSO系统进行登录,得到SSO返回的token,写到Cookie中
  • 每次请求时,Cookie都会带上,拦截器得到token,判断是否已经登录

首先,用户想要访问系统A受限的资源(比如说购物车功能,购物车功能需要登录后才能访问),系统A发现用户并没有登录,于是重定向到sso认证中心,并将自己的地址作为参数

SSO认证中心发现用户未登录,将用户引导至登录页面,用户进行输入用户名和密码进行登录,用户与认证中心建立全局会话(生成一份Token,写到Cookie中,保存在浏览器上)

随后,认证中心重定向回系统A,并把Token携带过去给系统A

接着,系统A去sso认证中心验证这个Token是否正确,如果正确,则系统A和用户建立局部会话(创建Session)。到此,系统A和用户已经是登录状态了。

其实SSO认证中心就类似一个中转站

中间人攻击 & Charles抓包工具

攻击者与通讯的两端分别建立独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。在中间人攻击中,攻击者可以拦截通讯双方的通话并插入新的内容。

Charles是我们常用的抓包工具。在手机/电脑上装上Charles的证书即可。其原理就是在客户端和服务器之间充当代理服务器,可以过滤、转发请求。

中间人攻击过程

  1. 客户端发送请求到服务端,请求被中间人截获。
  2. 服务器向客户端发送公钥。
  3. 中间人截获公钥,保留在自己手上。然后自己生成一个【伪 造的】公钥,发给客户端。
  4. 客户端收到伪造的公钥后,生成加密hash值发给服务器。
  5. 中间人获得加密hash值,用自己的私钥解密获得真秘钥。同时生成假的加密hash值,发给服务器。
  6. 服务器用私钥解密获得假密钥。然后加密数据传输给客户端。

证书 Certificate

证书相关的概念。让我们逐一解释:

  1. Certificate: 数字证书是一个文件,通常由一个受信任的第三方(称为证书颁发机构或CA)签名,用于证明公钥所属的实体的身份。证书通常用于 SSL/TLS 连接,如网站安全连接(https),也用于签名电子文档和代码。
  2. Subject: 在数字证书中,主题字段表示证书的所有者或用户。例如,一个服务器的证书的主题可能是其域名,例如 www.example.com
  3. Issuer: 证书的发行者字段表示签发这个证书的证书颁发机构 (CA)。例如,Let's EncryptDigiCert 等。
  4. Serial Number: 每个由 CA 发出的证书都有一个唯一的序列号。这帮助在撤销证书或查找特定证书时能够唯一地标识它。
  5. Subject Alternative Name (SAN): 这是一个扩展属性,允许用户指定额外的主机名用于一个单一的证书。主要用途是多域 SSL 证书。例如,一个证书可能对 example.comblog.example.com 都有效。
  6. X.509 SHA-1 Thumbprint (in hex): 是证书的 SHA-1 哈希值。”Thumbprint” 是这个哈希的另一种称呼。它提供了一种快速识别和引用特定证书的方法,特别是当你有大量证书时。
  7. Key Identifier: 这通常是一个证书或公钥的标识符,可以用于识别或匹配特定的密钥。例如,在公钥基础结构 (PKI) 的上下文中,它可以用于识别用于加密或签名的特定公钥。
  8. Secret Identifier: 通常,这是一个用于识别存储在某处的特定密钥或凭证的标识符。在某些上下文中,它可以是一个GUID或其他唯一标识符,用于检索或引用一个特定的秘密或密钥。

这些概念是数字证书、加密和身份验证中的基础,理解它们对于安全的网络交互和数据保护至关重要。

Certificate pinning 证书绑定

为了对抗中间人攻击,可以使用以下方法。

  1. 证书绑定
    证书绑定所做的是,当建立HTTPS连接时,它不仅需要远程证书链到本地根CA,而且还需要被绑定的证书出现在证书链中。如果没有,客户端将在发送任何数据之前关闭连接。
    例如,对于x证书链,我们可以锁定中间证书,即TLS 05。攻击者永远无法提供包含该中间证书的有效证书链,因为:该证书是由D颁发的,并且D不在攻击者的控制之下。攻击者无法获得该证书的私钥以替换为新的私钥
  2. 应用层签名
    如果我们不太关心数据被劫持,而是更关心数据是否已被篡改,我们可以在每个服务器响应后添加签名以保护它。客户可以使用公共密钥/证书来验证签名,以了解数据是否被篡改。
    具体实现是:在azure上申请一个Keys,用私钥生成签名,公钥写死在客户端用来验证签名,这样可以保证数据没有被篡改。

OAuth2

OAuth(Open Authorization,开放授权)是一个开放标准的授权协议,允许用户授权第三方应用访问他们存储在资源服务上受保护的信息,而不需要将用户名和密码提供给第三方应用。

步骤

(A)用户打开客户端以后,客户端要求用户给予授权。

(B)用户同意给予客户端授权。

(C)客户端使用上一步获得的授权,向认证服务器申请令牌。

(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。

(E)客户端使用令牌,向资源服务器申请获取资源。

(F)资源服务器确认令牌无误,同意向客户端开放资源。

token

令牌(token)与密码(password)的作用是一样的,都可以进入系统,但是有几点差异。

(1)令牌是短期的,到期会自动失效,用户自己无法修改。密码一般长期有效,用户不修改,就不会发生变化。

(2)令牌可以被资源持有者撤销,会立即失效。以上例而言,我可以随时取消朋友的令牌,密码一般不允许被他人撤销。

(3)令牌有权限范围(scope),比如使用令牌只允许进入客厅,不允许进入卧室。对于网络服务来说,只读令牌比读写令牌更安全,而密码一般是完整权限。

JWT Token

JWT(JSON Web Token)是一个紧凑且自包含的方式,用于在各方之间安全地传递信息。一个 JWT 通常由三部分组成:头部 (Header),载荷 (Payload) 和签名 (Signature)。

1. 头部 (Header)

头部通常由两部分组成:令牌的类型(即JWT)和所使用的签名算法,例如 HMAC SHA256 或 RSA。例如:

jsonCopy code{
  "alg": "HS256",
  "typ": "JWT"
}

头部常见字段:

  • alg: 签名算法。常见的有 HS256RS256 等。
  • typ: 令牌类型。对于 JWT,这里总是为 “JWT”。

2. 载荷 (Payload)

载荷包含声明。声明是关于实体(通常是用户)和其他数据的语句。有三种类型的声明:注册、公共和私有声明。

常见的注册声明:

  • iss (Issuer):发布者,即令牌是由哪个实体发布的。
  • sub (Subject):主题,即令牌所表示的实体(通常是用户)。
  • aud (Audience):受众,即令牌发送的目标接收者。
  • exp (Expiration Time):过期时间,即令牌的过期日期/时间。
  • nbf (Not Before):不早于,即令牌在此日期/时间之前不可用。
  • iat (Issued At):发布时间,即令牌的发布日期/时间。
  • jti (JWT ID):JWT的唯一身份标识,主要用来作为一次性token,从而避免重放攻击。
  • nonce 是 “number used once” 的缩写。在 JWT 和其他安全上下文中,它主要用于确保每次产生的令牌都是唯一的,从而防止重放攻击。
  • 随机性和唯一性: 在某些系统中,nonce 可能被用作随机值,确保每次产生的 JWT 都是唯一的,即使它们的其他声明值相同。nonce 在 JWT 和其他安全协议中提供了一种机制,以确保令牌或请求的唯一性和防止重放攻击。

公共声明和私有声明可以由发布者自定义。

3. 签名 (Signature)

为了创建签名部分,您必须使用编码的头部、编码的载荷、一个秘钥、头部中指定的算法,并进行签名。

例如,如果您想使用 HMAC SHA256 算法,签名将是:

scssCopy codeHMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

签名用于验证发送者是谁以及消息是否被更改。

OAuth四种授权模式

客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0 规定了四种获得令牌的流程,可以选择实际情况选择最适合的一种,向第三方应用颁发令牌。

  • 授权码模式(authorization-code):正宗方式,支持refresh_token
  • 简化模式(implicit): 为web浏览器应用设计,不支持refresh_token
  • 密码模式(password): 为遗留系统设计,支持refresh_token
  • 客户端模式(client credentials)为后台api服务设计,不支持refresh_token

不管哪一种授权方式,第三方应用申请令牌之前,都必须先到系统备案,说明自己的身份,然后会拿到两个身份识别码:客户端 ID(client ID 用来标识第三方应用)和客户端密钥(client secret 用来进行安全加密)。这是为了防止令牌被滥用,没有备案过的第三方应用,是不会拿到令牌的。

MS OAuth 2.0 流程

  1. 弹出浏览器窗口,请求authorization code
  2. 用户授权,返回authorization code
  3. 用authorization code和client_id等请求OAuth bearer token
  4. 返回access_token和refresh_token
  5. 用access_token去call WebAPI

阿里云文档

参考2

MS文档

加密货币

创建账户

助记词如何保证没有重复?address的本质是一个64个字符的16进制串,通过助记词经过一系列计算映射到一个address,重复和直接穷举私钥hash没什么区别,概率是2256 分之一,是不可能猜中的。

createWallet的流程
CreateKeyring 
    GenerateMnemonic : use bip39.c worldlist.c random.c bcrypt.h generate mnemonic
        GenerateRandom(entropy, entropy_size);
            mnemonic_from_bytes : use random number to generate mnemonic
    CreateKeyringInternal
        MnemonicToSeed 64
            DeriveKeyPbkdf2HmacSha512 : mnemonic as password, with salt and iterations to get derived_key
            Pbkdf2Core->BCryptDeriveKeyPBKDF2
    ConstructRootHDKey : with seed and kEthRootPath
            HDKey::GenerateFromSeed : use seed generate private_key_ and 
                HmacSha512 HmacCore
                将hash出来的值,一半用于private_key_,一半用于chain_code_
                GeneratePublicKey 
                    secp256k1_ec_pubkey_create secp256k1_ec_pubkey_serialize
            DeriveChildFromPath
                继续生成一个HDKey
GetAccountName
AddAccountForKeyring
    addAccounts
        DeriveChild bit operation generate child_key
        add child_key to accounts_
    getAccountPath like m/44'/{coin}
    getPublicKeyAndAddress
        GetUncompressedPublicKey secp256k1
        address FromPublicKey

如何恢复/导出账户?如何上链?

TPM

TPM文档

enclave

字面意思,飞地,一个国家内别的国家的领土。

我们做的事情,就是用c语言写一个dll,然后在其他进程中调用起来。

开发这个进程的过程,就是创建一个虚拟机,在虚拟机里为这个dll赋予权限,用exe文件去调用这个dll里的方法。

参考文档

MPC

安全多方计算/安全多签技术(Secure Multi-Party Computation)主要是针对在无可信第三方的情况下,如何安全地计算一个约定函数的问题。安全多方计算是电子投票、门限签名以及网上拍卖等诸多应用得以实践、落地的密码学基础。安全多方计算通常缩写为 SMPC 或者 MPC。

核心:既保留用户体验,又避免在线、离线或在物理设备中存储整个私钥(单点妥协)。

KEK

kek是KeyEncryptionKey的缩写。这个需求是把用户的助记词加密存储到MS的云端备份,支持增删查改。由于涉及到用户的助记词,所以加密程度很高。

  1. 助记词在edge客户端加密后传输
  2. 每次传输都需要先请求一个sharedKey。每个sharedKey只能用一次,用后销毁。
  3. 每次增删都需要用户登录两次。一次是登录微软的个人账号,另一次是登录Dropbox的账号。Dropbox是具体的、存文件的地方。
  4. MFA还需要OAuth Token

加解密助记词和Nonce用到的算法:

sharedKey是用于Aes加密的密钥。客户端先传一个串到服务器端,服务器端再生成一个串用于AES加解密

private readonly ECCurve ecCurve = ECCurve.NamedCurves.nistP256;            
using ECDiffieHellman serverEcdh = ECDiffieHellman.Create(ecCurve);
var publicKey = serverEcdh.ExportSubjectPublicKeyInfo();

using ECDiffieHellman foreignPublic = ECDiffieHellman.Create(ecCurve);
            foreignPublic.ImportSubjectPublicKeyInfo(Convert.FromBase64String(clientPublicKeyBase64), out _);
var sharedKey = serverEcdh.DeriveKeyFromHash(foreignPublic.PublicKey, HashAlgorithmName.SHA256);

return (publicKey, sharedKey);

每次传输都需要base64编码

参考

pseudorandom function 伪随机

brute-force attacks 暴力破解

最后更新于 2024年7月5日 by qlili

0 0 votes
Article Rating
guest

1 Comment
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
1
0
Would love your thoughts, please comment.x
()
x