从以下问题我们可以看出:
用于 HOTP 的 Java 与 Golang (rfc-4226)
, 在 TOTP / HOTP / HmacSHA256 用例中使用密钥时,Java 并不能很好地发挥作用。我的分析是以下造成的麻烦:
String.getBytes
(当然)将为字符值 > 127 的字符提供负字节值;javax.crypto.Mac
并且javax.crypto.spec.SecretKeySpec
在外部和内部都byte[]
用于接受和转换密钥。
我们已经获得了一些飞天 C-200 单按钮 OTP 设备,它们带有一个由大于 127 的字节值组成的十六进制字符串密码。
我们已经成功地为这些代币创建了一个使用 Ruby 的 PoC,它可以完美运行。由于我们想将这些集成到Keycloak中,我们需要找到一个 Java 解决方案。
由于我们看到的每个 TOTP / HOTP / HmacSHA256 实现都使用了javax.crypto
库和byte[]
,因此我们担心我们必须重写所有使用的类,但要使用int
才能支持这种情况。
问:还有其他方法吗?我们如何在 Java 中的 HmacSHA256 计算中使用秘密,其中字节的值 > 127 而不必重写所有内容?
更新
我看错了方向。我的问题是密钥表示为一个字符串(Java 中的 UTF-16),其中包含 Unicode 字符,这些字符在传递getBytes()
到SecretKeySpec
.
强制StandardCharsets.ISO_8859_1
进行此转换可以解决问题。