1

实际上,我正在尝试在我的应用程序中使用 TOTP,而 google 身份验证器要求密钥采用 base32 格式。这就是我尝试将密钥转换为 base32 格式的原因

假设我有一个数字 = 150820200825235。

这个维基百科页面说RFC-4648是最常用的 base32 字母表。

这是我试图将数字转换为基数 32 的 java 代码:

    long key=150820200825235L;
    String base32Key = Long.toString(key,32);
    System.out.println(base32Key);

现在它正在将其打印为输出:

495e87tgcj

它包含 9,根据 RFC-4648 是无效的。

如何根据 Java 中的 RFC-4648 转换为 base32 数字?

另一件事 如果最广泛使用的 Base32 字母表确实符合 RFC-4648,那么为什么 java 不默认支持它呢?还是我的理解/代码有问题?

4

1 回答 1

1

RFC-4648 中定义的“Base32”是一种仅使用数字、大写字母和=填充来对 ASCII 文本中的二进制数据(“任意八位字节序列”)进行编码的方法。您可以在Apache Commons Codec 库中找到一个实现

如果您从一个类似的数字开始150820200825235并希望将其转换为 RFC 4648 base32,首先您需要决定如何将数字转换为字节序列。

例如,将long值转换为字节的一种方法是使用该DataOutputStream.writeLong方法。此方法使用 8 个字节。使用此方法写入 150820200825235L 并将结果字节编码为 base32 可为您提供AAAISK4QP3AZG===.

于 2020-08-15T17:03:06.960 回答