fix: 修复 JWT 密钥长度不足的问题
- 支持十六进制字符串密钥(自动解析) - 如果密钥长度不足 32 字节,使用 SHA-256 哈希扩展到 32 字节 - 确保密钥长度至少 256 位,满足 JWT 规范要求 - 解决 'key byte array is 184 bits which is not secure enough' 错误
This commit is contained in:
@@ -25,9 +25,39 @@ class JwtUtils {
|
||||
|
||||
/**
|
||||
* 获取签名密钥
|
||||
* 支持十六进制字符串和普通字符串
|
||||
* 确保密钥长度至少 32 字节(256 位)以满足 JWT 规范要求
|
||||
*/
|
||||
private fun getSigningKey(): SecretKey {
|
||||
return Keys.hmacShaKeyFor(secret.toByteArray())
|
||||
val keyBytes = try {
|
||||
// 尝试将密钥作为十六进制字符串解析
|
||||
if (secret.length >= 64 && secret.matches(Regex("^[0-9a-fA-F]+$"))) {
|
||||
// 十六进制字符串,每 2 个字符 = 1 字节
|
||||
// 64 字符 = 32 字节(256 位),符合 JWT 要求
|
||||
secret.chunked(2).map { it.toInt(16).toByte() }.toByteArray()
|
||||
} else {
|
||||
// 普通字符串,使用 UTF-8 编码
|
||||
secret.toByteArray()
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
// 如果解析失败,使用 UTF-8 编码
|
||||
secret.toByteArray()
|
||||
}
|
||||
|
||||
// 确保密钥长度至少 32 字节(256 位)
|
||||
// 如果密钥长度不够,使用 SHA-256 哈希扩展到 32 字节(更安全)
|
||||
val finalKeyBytes = if (keyBytes.size < 32) {
|
||||
val messageDigest = java.security.MessageDigest.getInstance("SHA-256")
|
||||
messageDigest.update(keyBytes)
|
||||
messageDigest.digest() // SHA-256 总是返回 32 字节
|
||||
} else if (keyBytes.size > 64) {
|
||||
// 如果太长,截取前 64 字节(支持 HS512,但通常使用 HS256 需要 32 字节)
|
||||
keyBytes.sliceArray(0 until 64)
|
||||
} else {
|
||||
keyBytes
|
||||
}
|
||||
|
||||
return Keys.hmacShaKeyFor(finalKeyBytes)
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user