如何按照RFC-4648在Java中将数字转换为base32

问题描述

实际上,我正在尝试在我的应用中使用TOTP,并且Google Authenticator要求密钥为base32格式。这就是我试图将密钥转换为base32格式的原因

假设我有一个号码= 150820200825235。

This维基百科页面上说,RFC-4648是最常用的base32字母。

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

    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不默认支持它?还是我的理解/代码有问题?

解决方法

RFC-4648中定义的

“ Base32”是一种仅使用数字,大写字母和=进行填充的ASCII文本中的二进制数据(“八进制的任意序列”)编码的方法。您可以在Apache Commons Codec library

中找到一个实现

如果您以150820200825235之类的数字开头并将其转换为RFC 4648 base32,则首先需要确定如何将该数字转换为字节序列。

敌人示例,一种将long值转换为字节的方法是使用DataOutputStream.writeLong方法。此方法使用8个字节。使用此方法写入150820200825235L并在base32中对结果字节进行编码,即可得到AAAISK4QP3AZG===

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...