面试题答案
一键面试JWT基本组成结构
- Header(头部):通常由两部分组成,令牌的类型(如JWT)和使用的哈希算法,例如
{"alg": "HS256", "typ": "JWT"}
。然后将这个JSON对象进行Base64Url编码,形成JWT的第一部分。 - Payload(负载):也是一个JSON对象,用来存放实际需要传递的数据。JWT规定了7个官方字段,如
iss
(签发者)、exp
(过期时间戳)、sub
(主题)等,但也可以自定义其他字段。同样将其进行Base64Url编码,成为JWT的第二部分。 - Signature(签名):要创建签名部分,需要使用编码后的Header、编码后的Payload、一个密钥(secret)和Header中指定的签名算法。例如使用HMAC SHA256算法,签名公式为
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
。签名用于验证消息在传递过程中有没有被更改,并且,在使用私钥签名的情况下,还可以验证JWT的发送者的身份。
在区块链项目中可能使用JWT进行安全认证的场景
- 用户登录与身份验证:在区块链应用的前端登录流程中,用户输入账号密码进行登录,后端验证成功后,生成包含用户身份信息(如地址、权限等)的JWT返回给前端。前端后续请求区块链相关服务时,将JWT放在请求头中,服务端通过验证JWT来确认用户身份,决定是否允许访问。
- 智能合约调用权限控制:当用户或外部应用程序想要调用区块链上的智能合约时,可能需要先获取一个包含特定权限信息的JWT。例如,只有具有特定权限的JWT才能调用某些敏感的智能合约函数,如资产转移等。智能合约可以通过与外部验证服务(如链下的JWT验证服务器)交互,验证JWT的合法性与权限,确保调用的安全性。
- 跨链交互认证:在不同区块链之间进行交互时,为了保证跨链通信的安全性和身份认证。例如,当一个区块链的用户想要访问另一个区块链的资源或服务时,源链可以生成一个包含用户身份和相关权限的JWT,目标链通过验证该JWT来确认用户是否有权限进行跨链操作。
- 节点间通信安全:区块链网络中的节点之间进行数据交互和共识过程中,使用JWT进行身份认证和消息完整性验证。例如,在拜占庭容错共识算法中,节点之间传递的消息可能会附上JWT,以确保消息来源的真实性和防止消息被篡改。