这是我第一次做一个需要JWT认证的项目,我正在学习this教程,但是我遇到了一个问题,我的密钥必须高于256 bits,我搜索了这里,找到了this post,但是我是这个主题的新手,所以我真的不知道如何使它成为256 bits。
@Service
public class JwtGeneration implements IJwtGeneration {
@Value("${jwt.secret}")
private String secret;
@Value("${app.jwttoken.message}")
private String message;
@Override
public Map<String, String> generateToken(User user) {
String jwtToken="";
jwtToken = Jwts.builder().setSubject(user.getUserName()).setIssuedAt(new Date()).signWith(SignatureAlgorithm.HS256, "secret").compact();
Map<String, String> jwtTokenGen = new HashMap<>();
jwtTokenGen.put("token", jwtToken);
jwtTokenGen.put("message", message);
return jwtTokenGen;
}
}
我怎样才能把它变成256位呢?
搜索了更多,我发现我可以试试这个:
@Service
public class JwtGeneration implements IJwtGeneration {
@Value("${jwt.secret}")
private String secret;
byte[] decodedKey = secret.getBytes(StandardCharsets.UTF_8);
SecretKey key = new SecretKeySpec(decodedKey, 0, decodedKey.length, "HMACSHA256");
@Value("${app.jwttoken.message}")
private String message;
@Override
public Map<String, String> generateToken(User user) {
String jwtToken="";
jwtToken = Jwts.builder().setSubject(user.getUserName()).setIssuedAt(new Date()).signWith(key, SignatureAlgorithm.HS256).compact();
Map<String, String> jwtTokenGen = new HashMap<>();
jwtTokenGen.put("token", jwtToken);
jwtTokenGen.put("message", message);
return jwtTokenGen;
}
}
但我仍然得到错误,我该如何修复它?
UPDATE这是我收到的错误消息:“网络令牌安全漏洞异常:签名密钥的大小为48位,这对于HS 256算法来说不够安全。JWT JWA规范(RFC 7518,第3.2节)规定,HS 256使用的密钥大小必须〉= 256位(密钥大小必须大于或等于哈希输出大小)。请考虑使用io.jsonwebtoken.security.Keys类的“secretKeyFor(SignatureAlgorithm.HS256)'用于创建保证对HS 256足够安全的密钥的方法。https://tools.ietf.org/html/rfc7518#section-3.2有关详细信息,请访问www.example.com。在com.authdemo. authDemo.config.JwtGeneration.生成令牌(JwtGeneration. java:26)~[类/:na]在com.authdemo.authDemo.controller.用户控制器.登录用户(用户控制器. java:44)~[类/:na]”
我试过SecretKey key = secretKeyFor(SignatureAlgorithm.HS256)
,但是没有用。
1条答案
按热度按时间hrirmatl1#
我找到了解决方案,我不得不添加到我的POM以下依赖项:jjwt-impl和jjwt-jackson。我还必须创建我的密钥如下:
原来我在应用程序属性中使用了“secretkey”作为我的jwt.secret,并且我只传递了那个变量,现在我使用了一个在线密钥生成器,然后创建了一个函数将其转换为Key,然后将其传递给signWith()方法。