在 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 而不必重写所有内容?
更新
我看错了方向。我的问题是,密钥表示的字符串(UTF-16在Java中),其包含在被分解成Unicode字符2个的字节getBytes()
,在通入之前SecretKeySpec
。
强制StandardCharsets.ISO_8859_1
执行此转换可解决此问题。
一只萌萌小番薯
偶然的你
相关分类