公钥、私钥与JWT

公钥和私钥是现代密码学中用于加密和解密数据的两个密钥,在非对称加密系统(也称为公钥加密系统)中使用。这种加密方法允许发送者和接收者无需共享秘密密钥就可以安全地交换信息。下面是一些关于公钥和私钥的基本概念:

  1. 非对称加密

    • 非对称加密算法使用一对密钥:一个公钥和一个私钥。
    • 公钥可以公开分享给任何人,而私钥则必须保密。
  2. 公钥 (Public Key)

    • 用于加密数据或验证数字签名。
    • 可以被广泛分发,任何人都可以用它来加密发送给密钥所有者的消息。
  3. 私钥 (Private Key)

    • 用于解密用相应公钥加密的数据或生成数字签名。
    • 必须由密钥所有者妥善保管,不得泄露给他人。
  4. 工作原理

    • 如果数据用公钥加密,则只能用对应的私钥解密。
    • 如果数据用私钥加密(如在数字签名中),则可以用公钥验证签名的真实性。
  5. 用途

    • 加密通信:发送方使用接收方的公钥加密消息,只有持有对应私钥的人才能解密。
    • 数字签名:发送方使用自己的私钥对消息进行签名,接收方可以使用发送方的公钥验证签名的有效性。
  6. 常见算法

    • RSA(Rivest–Shamir–Adleman)
    • ECC(Elliptic Curve Cryptography)
    • DSA(Digital Signature Algorithm)
  7. 安全性

    • 安全性基于数学难题,例如大数分解问题(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非对称加密:

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 JWT(JSON Web Token)的公钥私钥,主要涉及生成签名(签发令牌)和验证签名(验证令牌)两个过程。 1. 生成签名(签发令牌): - 使用私钥JWT 的头部和载荷进行数字签名,以确保令牌的完整性和真实性。 - 将签名后的结果添加到 JWT 的头部或载荷中,形成最终的 JWT。 2. 验证签名(验证令牌): - 获取 JWT 中的头部和载荷,并提取签名部分。 - 使用公钥对头部和载荷进行验证,以确认令牌是由合法的签发者签名的。 - 如果验证成功,则说明令牌是有效的。 在实际应用中,生成签名和验证签名的具体实现细节会根据编程语言和库的不同而有所差异。以下是一个示例,使用 C# 和 System.IdentityModel.Tokens.Jwt 库来生成和验证 JWT 的过程: ```csharp using System; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using Microsoft.IdentityModel.Tokens; public class JwtHelper { public static string GenerateToken(string privateKey) { var securityKey = new SymmetricSecurityKey(Convert.FromBase64String(privateKey)); var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256); var tokenHandler = new JwtSecurityTokenHandler(); var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(new Claim[] { new Claim("userId", "123") }), Expires = DateTime.UtcNow.AddDays(1), SigningCredentials = credentials }; var token = tokenHandler.CreateToken(tokenDescriptor); return tokenHandler.WriteToken(token); } public static bool ValidateToken(string token, string publicKey) { var tokenHandler = new JwtSecurityTokenHandler(); var validationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Convert.FromBase64String(publicKey)), ValidateIssuer = false, // 可选,如果需要验证签发者,请将其设置为 true,并提供有效的 Issuer ValidateAudience = false // 可选,如果需要验证受众,请将其设置为 true,并提供有效的 Audience }; try { // 验证令牌 tokenHandler.ValidateToken(token, validationParameters, out _); return true; } catch (Exception) { // 令牌验证失败 return false; } } } ``` 上述代码中,`GenerateToken` 方法用于生成 JWT,其中传入私钥 `privateKey` 用于生成签名。在 `tokenDescriptor` 中,我们设置了 JWT 的主题(Subject)、过期时间(Expires)等信息,并使用私钥进行签名。 `ValidateToken` 方法用于验证 JWT,其中传入公钥 `publicKey` 用于验证签名。在 `validationParameters` 中,我们设置了验证签名的密钥(IssuerSigningKey)和其他可选的验证参数(如验证签发者和受众)。 请注意,上述示例中使用的是对称加密算法(HMAC),密钥是以 Base64 编码的字符串。如果使用非对称加密算法(如 RSA),则需要使用公钥私钥对,并且相应的密钥格式和库的使用可能会有所不同。 总之,通过使用 JWT公钥私钥,你可以生成签名并签发令牌,也可以验证令牌的签名的真实性和完整性。具体的实现方法会根据你所使用的编程语言和库而有所差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值