emqx启用JWT令牌认证(包含hmac()

  本篇文章为你整理了emqx启用JWT令牌认证(包含hmac()的详细内容,包含有 emqx启用JWT令牌认证(包含hmac,希望能帮助你了解 emqx启用JWT令牌认证(包含hmac。

  JWT 即 JSON Web Tokens
 

  是一种开放的,用于在两方之间安全地表示声明的行业标准的方法(RFC 7519)。

  令牌的形式 xxx.yyy.zzz

  

eyJhbGciOiJIUzI1NiJ9

 

  .eyJleHAiOjE2NjU0Nzc4NjEsInVzZXIiOiJtcXR0LWNsaWVudCIsImlhdCI6MTY2NTQ3Njg2MX0

  .S9ZrrAk2zmUC2zQ7YNcGwhojLOKV5Bhe3zrMv6rQuzE

  

 

  由三部分组成,先后分别为HEADER、PAYLOAD、VERIFY SIGNATURE
 

  简单的说,xxx和yyy是对JSON字符串进行base64加密得到,
 

  zzz是由“xxx.yyy”加密得到,最后组装成 xxx.yyy.zzz

  HEADER

  HEADER(头部)由 ALGORITHM(算法) 和 TOKEN TYPE(令牌类型) 组成

  

{

 

   "alg": "HS256",

   "typ": "JWT"

  

 

  xxx由HEADER使用Base64加密得到
 

  alg : 表示签名的算法
 

  typ : 表示令牌的类型

  PAYLOAD

  PAYLOAD(负载)存放一些用户信息,但不能存放敏感信息,因为负载中的信息是公开的
 

  yyy由PAYLOAD使用Base64加密得到

  VERIFY SIGNATURE

  VERIFY SIGNATURE(验证签名)
 

  zzz由前两部分使用签名加密得到,即对 xxx.yyy 加密,中间连接的“.”是需要的

  生成JWT

  

 dependency 

 

   groupId io.jsonwebtoken /groupId

   artifactId jjwt /artifactId

   version 0.6.0 /version

   /dependency

  

 

  api使用方式是生成JwtBuilder对象 然后调用compact()方法,就能得到JWT.JWT主要由三部分组成,那么代码中同理需要对三部分进行构造,使用api时,主要是对PAYLOAD和VERIFY SIGNATURE进行赋值.

  

 Instant now = Instant.now();

 

   Map String, Object claims = new HashMap ();

   claims.put("user", "mqtt-client");

   String compact = Jwts.builder()

   .setClaims(claims) // 自定义声明

   .setIssuedAt(Date.from(now)) // 对标准中的声明赋值,设置签发时间

   .setExpiration(Date.from(now.plusSeconds(1000))) // 对标准中的声明赋值,设置过期时间

   .signWith(SignatureAlgorithm.HS256, "NmVlR3l2T3BiQnBXMi9veVBlcTZWaEpES09XTzdoWnM=") // 设置签名

   .compact();

   System.out.println(compact);

  

 

  值得注意的一点是:不要在 setXxx(标准中的声明) 之后调用 setClaims,因为这两个方法会覆盖所有已设置的声明

  PAYLOAD可以分为payload和claims,但是两者既不能都为空也不能都存在,同时只能存在一个,否则将会报错.
 

  可以不手动设置HEADER,api中会自动设置,当然,自己手动设置HEADER属性也可以

  HEADER中的alg会随构造的签名自动变更

  关于默认的claims

  
根据RFC 7519协议标准 我们获取到JWT标准中claims的字段,这些字段是可选的

  

1. iss :Issuer,颁发者

 

  2. sub : Subject,主题

  3. aud : Audience,受众

  4. exp :Expiration Time,过期时间

  5. nbf :Not Before,不能被接受处理的时间

  6. iat :Issued At,发布时间

  7. jti :JWT ID

  这些claims字段可以根据需要去设置,也可以自己定义claim

  

 

  emqx的安装

  根据环境自己选择下载

  如果连接不上服务,建议查看8083端口是否打开

  如果dashborad无法打开,建议查看18083端口是否打开

  hmac-based方式验证

  emqx中hmac-based方式,表明 JWT 将使用对称密钥生成签名和校验签名(支持 HS256、HS384 和 HS512 算法),上述的JWT令牌使用的是SignatureAlgorithm.HS256,使用该方式验证,上述代码可以直接使用

  

HS256("HS256", "HMAC using SHA-256", "HMAC", "HmacSHA256", true)

 

  

 

  Secret,用于校验签名的密钥,与生成签名时使用的密钥相同

  Secret Base64 Encode,表明 Secret 是否经过 Base64 加密,即 EMQX 在使用 Secret 校验签名时是否需要先对其进行 Base64 解密

  public-key方式验证

  emqx中public-key方式,表明 JWT 使用私钥生成签名,需要使用公钥校验签名(支持 RS256、RS384、RS512、ES256、ES384 和 ES512 算法),对于生成的JWT令牌来说,加密方式我这里换成了RSA,即SignatureAlgorithm.RS256

  

RS256("RS256", "RSASSA-PKCS-v1_5 using SHA-256", "RSA", "SHA256withRSA", true)

 

  

 

  其原理是对JWT令牌使用私钥加签,然后将公钥配置在emqx上,连接时用emqx中的公钥验签,防止信息被篡改

  Public Key,指定用于校验签名的 PEM 格式的公钥
 

  PEM格式的公钥私钥生成

  首先,需要在windows上安装openssl,然后通过指令生成pem格式文件

  

 openssl生成私钥命令: openssl genrsa -out rsa_private_key.pem 1024

 

   openssl生成公钥命令: openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

  

 

  
 

  
 

  PEM格式的私钥Java代码中是没办法直接使用的,需要手动或者通过方法变成连续的字符串

  

MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAMGL0LhjNqcK32eTHLrmJovihQjIGYJrqw+GsAwgQxLq2SUZxEkbNNOK8OnR5S8g3PUdHraqWlthiLWLfZB3HjsIhq7if9giln9NkCs8hrbIxaghJTB3zo/L7+Bq2eL3zx5ke9ExceG9Xb7d5RCQ1d/xmzKNZqgC0tOGiiaLrU89AgMBAAECgYBhCNDu8MbgvqG80tOvnF2s+jdKbM/lREex9AvlOHOIU3fkkuOG5333pQwdnh7yHt7IgP36BLRiZibdJf8g46eif+Azf7nmH9fW4tQagdjoVoZGz+9Vp9m2ERRsy7Po50d4C5WQdKbxWiSE6qTWtrqIxpZCGkhPyuWsPaYNTQ2TXQJBAOSM1wFtXD3ivSS+SjgTessQdWHaK/xRvN+glr6JJhzK0Tl6xb8IftFJjBi4RY3e1eAciYVhnTDpQfhKGrRumVMCQQDYyrfldKPxXwWelAVbSAepOrU+Iod0DUKpCRS83dGMQFLI/fmAdNL2AY2drr3w6xdeAWTAagB4sKzWoyEMShMvAkEAr42PSUVbaR3U83hHQjOUSo5l27fduX5/eba8k7Z9U/hmJaSsaER6RQAdYI+KvaLA3diNuap1N7C0P6eMQ7QAiQJBAICYh0shzFnSLsgpL6A88uZsf7Qy0TyC3SbdzyJVRga25SR6mvSa18S7mSCO1fbBzSOjGfuVJWByFKRhMapTilsCQQCaVsZ/2QrlzeHaAfWbMSVi8ml3JlF1nCOyiNtypNJB+HXXrE6SJc3vRnwPIku1N6uduQF2W0ypykCzDdcqGkuF

 

  

 

  PEM格式中带有换行符,处理时需要注意,此时连接的字符串就位私钥

  

package com.mio.mqtt.util;

 

  import io.jsonwebtoken.Jwts;

  import io.jsonwebtoken.SignatureAlgorithm;

  import sun.misc.BASE64Decoder;

  
String privateKey = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAMGL0LhjNqcK32eTHLrmJovihQjIGYJrqw+GsAwgQxLq2SUZxEkbNNOK8OnR5S8g3PUdHraqWlthiLWLfZB3HjsIhq7if9giln9NkCs8hrbIxaghJTB3zo/L7+Bq2eL3zx5ke9ExceG9Xb7d5RCQ1d/xmzKNZqgC0tOGiiaLrU89AgMBAAECgYBhCNDu8MbgvqG80tOvnF2s+jdKbM/lREex9AvlOHOIU3fkkuOG5333pQwdnh7yHt7IgP36BLRiZibdJf8g46eif+Azf7nmH9fW4tQagdjoVoZGz+9Vp9m2ERRsy7Po50d4C5WQdKbxWiSE6qTWtrqIxpZCGkhPyuWsPaYNTQ2TXQJBAOSM1wFtXD3ivSS+SjgTessQdWHaK/xRvN+glr6JJhzK0Tl6xb8IftFJjBi4RY3e1eAciYVhnTDpQfhKGrRumVMCQQDYyrfldKPxXwWelAVbSAepOrU+Iod0DUKpCRS83dGMQFLI/fmAdNL2AY2drr3w6xdeAWTAagB4sKzWoyEMShMvAkEAr42PSUVbaR3U83hHQjOUSo5l27fduX5/eba8k7Z9U/hmJaSsaER6RQAdYI+KvaLA3diNuap1N7C0P6eMQ7QAiQJBAICYh0shzFnSLsgpL6A88uZsf7Qy0TyC3SbdzyJVRga25SR6mvSa18S7mSCO1fbBzSOjGfuVJWByFKRhMapTilsCQQCaVsZ/2QrlzeHaAfWbMSVi8ml3JlF1nCOyiNtypNJB+HXXrE6SJc3vRnwPIku1N6uduQF2W0ypykCzDdcqGkuF";

  
BASE64Decoder base64Decoder=new BASE64Decoder();

   byte[] bytes = base64Decoder.decodeBuffer(privateKey);

   KeySpec spec = new PKCS8EncodedKeySpec(bytes);

   KeyFactory keyFactory = KeyFactory.getInstance("RSA");

  
.setClaims(claims) // 自定义声明

   .setIssuedAt(Date.from(now)) // 对标准中的声明赋值,设置签发时间

   .setExpiration(Date.from(now.plusSeconds(1000))) // 对标准中的声明赋值,设置过期时间

   .signWith(SignatureAlgorithm.RS256, keyFactory.generatePrivate(spec)) // 设置签名

   .compact();

   System.out.println(compact);

   } catch (Exception e) {

   throw new RuntimeException(e);

  

 

  以上就是emqx启用JWT令牌认证(包含hmac()的详细内容,想要了解更多 emqx启用JWT令牌认证(包含hmac的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: