java 签名密钥的大小为48位,这对于HS256算法来说不够安全

2ic8powd  于 2023-02-02  发布在  Java
关注(0)|答案(1)|浏览(688)

这是我第一次做一个需要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),但是没有用。

hrirmatl

hrirmatl1#

我找到了解决方案,我不得不添加到我的POM以下依赖项:jjwt-impl和jjwt-jackson。我还必须创建我的密钥如下:

private String secret = "2D4A614E645267556B58703273357638792F423F4428472B4B6250655368566D";


@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(getSignInKey(),SignatureAlgorithm.HS256).compact();
    Map<String, String> jwtTokenGen = new HashMap<>();
    jwtTokenGen.put("token", jwtToken);
    jwtTokenGen.put("message", message);
    return jwtTokenGen;
}

private Key getSignInKey() {
    byte[] keyBytes = Decoders.BASE64.decode(secret);
    return Keys.hmacShaKeyFor(keyBytes);
}

原来我在应用程序属性中使用了“secretkey”作为我的jwt.secret,并且我只传递了那个变量,现在我使用了一个在线密钥生成器,然后创建了一个函数将其转换为Key,然后将其传递给signWith()方法。

相关问题