From 86dc772b7dcd66e9934bab2f309524bcafc55a2d Mon Sep 17 00:00:00 2001 From: WrBug Date: Wed, 3 Dec 2025 05:52:25 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20JWT=20=E5=AF=86?= =?UTF-8?q?=E9=92=A5=E9=95=BF=E5=BA=A6=E4=B8=8D=E8=B6=B3=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 支持十六进制字符串密钥(自动解析) - 如果密钥长度不足 32 字节,使用 SHA-256 哈希扩展到 32 字节 - 确保密钥长度至少 256 位,满足 JWT 规范要求 - 解决 'key byte array is 184 bits which is not secure enough' 错误 --- .../com/wrbug/polymarketbot/util/JwtUtils.kt | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/backend/src/main/kotlin/com/wrbug/polymarketbot/util/JwtUtils.kt b/backend/src/main/kotlin/com/wrbug/polymarketbot/util/JwtUtils.kt index 0d6da5e..17cb932 100644 --- a/backend/src/main/kotlin/com/wrbug/polymarketbot/util/JwtUtils.kt +++ b/backend/src/main/kotlin/com/wrbug/polymarketbot/util/JwtUtils.kt @@ -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) } /**