当前位置: 首页 > 面试题库 >

如何在Java中生成等效于Python示例的HMAC?

陆甫
2023-03-14
问题内容

我正在寻找实现Java中通过Oauth获得Twitter授权的应用程序。第一步是获取请求令牌。这是应用引擎的Python示例。

为了测试我的代码,我正在运行Python并使用Java检查输出。这是Python生成基于哈希的消息认证代码(HMAC)的示例:

#!/usr/bin/python

from hashlib import sha1
from hmac import new as hmac

key = "qnscAdgRlkIhAUPY44oiexBKtQbGY0orf7OV1I50"
message = "foo"

print "%s" % hmac(key, message, sha1).digest().encode('base64')[:-1]

输出:

$ ./foo.py
+3h2gpjf4xcynjCGU5lbdMBwGOc=

如何用Java复制此示例?

我看过Java
中HMAC的示例:

try {
    // Generate a key for the HMAC-MD5 keyed-hashing algorithm; see RFC 2104
    // In practice, you would save this key.
    KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");
    SecretKey key = keyGen.generateKey();

    // Create a MAC object using HMAC-MD5 and initialize with key
    Mac mac = Mac.getInstance(key.getAlgorithm());
    mac.init(key);

    String str = "This message will be digested";

    // Encode the string into bytes using utf-8 and digest it
    byte[] utf8 = str.getBytes("UTF8");
    byte[] digest = mac.doFinal(utf8);

    // If desired, convert the digest into a string
    String digestB64 = new sun.misc.BASE64Encoder().encode(digest);
} catch (InvalidKeyException e) {
} catch (NoSuchAlgorithmException e) {
} catch (UnsupportedEncodingException e) {
}

它使用javax.crypto.Mac,一切都很好。但是,SecretKey构造函数采用字节和算法。

Python示例中的算法是什么?没有算法怎么能创建Java密钥?


问题答案:

HmacSHA1似乎是您需要的算法名称:

SecretKeySpec keySpec = new SecretKeySpec(
        "qnscAdgRlkIhAUPY44oiexBKtQbGY0orf7OV1I50".getBytes(),
        "HmacSHA1");

Mac mac = Mac.getInstance("HmacSHA1");
mac.init(keySpec);
byte[] result = mac.doFinal("foo".getBytes());

BASE64Encoder encoder = new BASE64Encoder();
System.out.println(encoder.encode(result));

产生:

+3h2gpjf4xcynjCGU5lbdMBwGOc=

请注意,这里我已经使用sun.misc.BASE64Encoder了快速实现,但是您可能应该使用不依赖于Sun JRE的东西。例如,Common
Codec中的base64-encoder
将是一个更好的选择。



 类似资料:
  • 问题内容: 我正在寻找可用于在运行时生成声音的Java代码-而不是现有声音文件的播放。 例如,在2毫秒的时间内生成440 Hz的锯齿波形的最佳代码是什么? 源代码赞赏! 我记得我的Commodore 128有一个简单的Sound命令,该命令以语音,频率,波形和持续时间作为参数来定义声音。在许多简单的情况下(快速而肮脏的游戏,声音实验等),效果都很好。 我正在专门寻找声音效果,例如声音,而不是音乐或

  • 问题内容: 是否可以在Scala中实现与Python语句等效的功能,在该语句中它记住使用该函数的局部状态,并在每次调用该函数时“产生”下一个值? 我希望有类似这样的东西可以将递归函数转换为迭代器。有点像这样: 除此以外,可能会更复杂并通过一些非循环对象图重复出现。 附加编辑: 让我添加一个更复杂的示例(但仍然很简单):我可以编写一个简单的递归函数,以进行打印: 理想情况下,我希望拥有一个可以轻松更

  • 我已经退出Java游戏大约8年了,从那以后发生了很多变化。对我来说最大的挑战是RxJava/反应式。我正在寻找关于如何以完全反应式的方式执行以下等效操作的粗略指导。 下面使用ThreadPoolExecutor实现的基本需求是通过调用远程web服务来处理大量的内容,该服务的记录速率限制为每分钟100个请求。我的目标是尽可能快地处理,不丢弃任何东西,但仍然遵守下游利率限制。该代码已被简化,以避免错误

  • 问题内容: 最近,我遇到了一些Java代码,这些代码简单地将一些字符串放入Java TreeSet中,为其实现了基于距离的比较器,然后在日落时分快乐地计算出给定的分数来解决给定的问题。 我的问题 是否有适用于Python的等效数据结构? Java树集看起来基本上是一个有序字典,可以使用某种比较器来实现这种排序。 我看到有一个用于 OrderedDict的Py3K的PEP,但是我使用的是2.6.x。

  • 问题内容: 我有两个对象,想要将它们配对,就像Python中的函数一样。我很确定JDK中没有此功能,但是在相当广泛的库中是否有类似Apache通用收藏集的类似内容?谢谢。 问题答案: 功能Java具有,以及您对Haskell或Scala的期望。(实际上,作者几乎都是Haskell程序员。)

  • 问题内容: 我有一些需要在C++中模仿的示例Python代码。我不需要任何特定的解决方案(例如基于协同例程的收益解决方案,尽管它们也是可接受的答案),我只需要以某种方式重现语义即可。 python 这是一个基本的序列生成器,显然太大了,无法存储实例化版本。 目标是维护上述序列的两个实例,并以半锁步的方式在块上进行迭代。在下面的示例中,使用对的序列来初始化缓冲区,然后重新生成 相同的精确序列 并再次