公钥和私钥是现代密码学中用于加密和解密数据的两个密钥,在非对称加密系统(也称为公钥加密系统)中使用。这种加密方法允许发送者和接收者无需共享秘密密钥就可以安全地交换信息。下面是一些关于公钥和私钥的基本概念:
-
非对称加密:
- 非对称加密算法使用一对密钥:一个公钥和一个私钥。
- 公钥可以公开分享给任何人,而私钥则必须保密。
-
公钥 (Public Key):
- 用于加密数据或验证数字签名。
- 可以被广泛分发,任何人都可以用它来加密发送给密钥所有者的消息。
-
私钥 (Private Key):
- 用于解密用相应公钥加密的数据或生成数字签名。
- 必须由密钥所有者妥善保管,不得泄露给他人。
-
工作原理:
- 如果数据用公钥加密,则只能用对应的私钥解密。
- 如果数据用私钥加密(如在数字签名中),则可以用公钥验证签名的真实性。
-
用途:
- 加密通信:发送方使用接收方的公钥加密消息,只有持有对应私钥的人才能解密。
- 数字签名:发送方使用自己的私钥对消息进行签名,接收方可以使用发送方的公钥验证签名的有效性。
-
常见算法:
- RSA(Rivest–Shamir–Adleman)
- ECC(Elliptic Curve Cryptography)
- DSA(Digital Signature Algorithm)
-
安全性:
- 安全性基于数学难题,例如大数分解问题(RSA)或椭圆曲线离散对数问题(ECC)。
- 密钥长度越长,破解难度越大,因此安全性也越高。
常用的RSA对称加密中的一些名词:
密钥对:在非对称加密技术中,有两种密钥,分为私钥和公钥,私钥是密钥对所有者持有,不可公布,公钥是密钥对持有者公布给他人的。密钥对中的一种密钥加密的数据必定能使用另一种密钥解密。
公钥:公钥用来加密数据;验证私钥生成的签名。
私钥:私钥用来解密公钥加密的数据;生成签名。
摘要:对需要传输的文本,做一个HASH计算。
签名:使用私钥对需要传输的文本的摘要进行加密,得到的密文即被称为该次传输过程的签名。
验签:数据接收端拿到传输文本后,需要确认发送者身份以及数据是否被篡改。因此需要将自己持有的公钥对签名进行解密得到一个摘要,然后使用发送方指定的HASH算法计算出文本的摘要。最后将计算出的文本摘要与解密得到的摘要做对比,发现二者完全一致,则说明数据没有被篡改。
加密:使用公钥对数据进行加密。
解密:使用私钥对数据进行解密。
实际上,CA证书是一个反过来的例子,CA使用私钥加密数据,公钥解密数据,以便于认证。
JWT 简介:
JSON Web Token(JWT)是一种轻量级、自包含的安全标准,用于在各方之间安全地传输信息。它以 JSON 对象的形式存在,包含三个部分:Header(头部)、Payload(载荷)和Signature(签名)。JWT 被广泛应用于认证、授权和信息交换场景,如单点登录(SSO)、API 安全认证等。
JWT 的优势在于:
无状态性:服务器无需存储会话信息,降低了服务器负担。
自包含:所有必要信息直接包含在 JWT 中,便于跨域传输。
安全性:通过签名机制确保数据的完整性和防篡改。
JWT 如何防篡改:
JWT 通过其内置的签名机制来防止数据被篡改,确保消息的完整性和真实性。JWT 的结构分为三部分:Header、Payload 和 Signature。签名部分正是 JWT 防止篡改的关键所在,其生成和验证流程如下:
签名生成过程:
1. Header 和 Payload 编码:首先,JWT 的 Header 和 Payload 分别被 Base64Url 编码,形成两段字符串。Header 包含了关于 JWT 的元数据,如签名算法类型;Payload 则包含了实际要传输的数据,如用户标识、过期时间等。
2. 签名数据准备:将编码后的 Header 和 Payload 通过 . 连接起来形成一个字符串,这个字符串与用于签名的密钥(可以是对称密钥或私钥,依据所选签名算法而定)一起作为签名的输入。
3. 签名计算:根据 Header 中声明的签名算法(如 HMAC SHA256、RSA、ECDSA 等),使用密钥对上述拼接的字符串进行加密计算,产生一个签名字符串。
4. 组合 JWT:最后,将 Base64Url 编码的 Header、Payload 和新产生的 Signature 通过 . 连接,形成完整的 JWT 字符串。
防篡改验证过程:
1. 接收 JWT:接收方首先解析 JWT,将其分割成 Header、Payload 和 Signature 三部分。
2. 签名验证:
①使用对称加密方式的JWT:再次对 Header 和 Payload 进行 Base64Url 解码,并使用声明的签名算法和相应的密钥对这两部分数据进行计算,生成一个新的签名字符串。将新生成的签名与 JWT 中携带的原始 Signature 进行比较,如果两者完全一致,则说明在传输过程中 JWT 没有被篡改,其内容是完整且真实的;若不一致,则表明 JWT 可能被篡改或不是由预期的发送方发出。
②使用非对称加密方式的JWT:再次对 Header 和 Payload 进行 Base64Url 解码,根据Header中指定的算法对Header 和 Payload 计算哈希值,使用公钥对签名部分(Signature)解密得到被私钥加密的哈希值。将计算得到的哈希值与解密得到的的哈希值进行比较,如果两者完全一致,则说明在传输过程中 JWT 没有被篡改,其内容是完整且真实的;若不一致,则表明 JWT 可能被篡改或不是由预期的发送方发出。
JWT对称加密:
JWT非对称加密: