当前位置: 首页 > 知识库问答 >
问题:

PHP的hmac sha256实现与Java的不匹配

帅锦
2023-03-14

谢谢你!

共有1个答案

司徒墨竹
2023-03-14

*解决方案

下面是我提到的Rob Swan的php实现的副本:

<?php

// Define your secret seed
// NB: this is a hexadecimal representation of the example
// ASCII string which is: 12345678901234567890
$secret_seed = "3132333435363738393031323334353637383930";

// Determine the time window as 30 seconds
$time_window = 30;

// Set the timestamp manually
$exact_time = 1111111109;

// Round the time down to the time window
$rounded_time = floor($exact_time/$time_window);

// Pack the counter into binary
$packed_time = pack("N", $rounded_time);

// Make sure the packed time is 8 characters long
$padded_packed_time = str_pad($packed_time,8, chr(0), STR_PAD_LEFT);

// Pack the secret seed into a binary string
$packed_secret_seed = pack("H*", $secret_seed);

// Generate the hash using the SHA1 algorithm
$hash = hash_hmac ('sha1', $padded_packed_time, $packed_secret_seed, true);

// NB: Note we have change the exponent in the pow function 
// from 6 to 8 to generate an 8 digit OTP not a 6 digit one 

// Extract the 8 digit number fromt the hash as per RFC 6238
$offset = ord($hash[19]) & 0xf;
$otp = (
    ((ord($hash[$offset+0]) & 0x7f) << 24 ) |
    ((ord($hash[$offset+1]) & 0xff) << 16 ) |
    ((ord($hash[$offset+2]) & 0xff) << 8 ) |
    (ord($hash[$offset+3]) & 0xff)
) % pow(10, 8);

// NB: Note that we are padding to 8 characters not 6 for this example

// Add any missing zeros to the left of the numerical output
$otp = str_pad($otp, 8, "0", STR_PAD_LEFT);

// Display the output, which should be 
echo "This should display 07081804: " . $otp;

?>

重点是这条线:

$offset = ord($hash[19]) & 0xf;
$offset = ord($hash[strlen($hash)-1]) & 0xf;
 类似资料:
  • 我想在共享托管服务器中安装php依赖项,但是作曲家说我的php版本是(对我的依赖项来说太旧了),这是真的,所以我用一个叫做"MultiPHP管理器”。好吧,直到我重试运行,作曲家一直说我的php版本是。 然后我在一个虚拟页面中检查了,它说我的版本是。我还运行了,结果显示我的版本是。 我试过了 重新加载 运行和但它说已禁用,但我使用名为“MultiHP INI编辑器”的cpanel工具启用了它,说已

  • 问题内容: 我在LONGTEXT列中有此数据(因此保留了换行符): 我正在尝试将第1段到第3段匹配。我正在使用以下代码: 这什么也不会返回。如果我尝试通过匹配以下内容在段落的第一行中工作: 然后代码工作,我得到正确的字符串返回。我在这里做错了什么? 问题答案: 使用修饰符。 http://php.net/manual/zh/reference.pcre.pattern.modifiers.php

  • 问题内容: 我正在使用一个加密系统,该系统会将数据传递给第三方应用程序。加密用Java完成,解密用PHP完成。尽管进行了几次尝试,但我无法获得PHP应用程序打开的加密字符串。 为了进行测试,我创建了一个PHP脚本,该脚本也对数据进行了加密,因此可以比较Java和PHP加密的字符串。结果匹配到第21个字符,然后有所不同。这就是我所拥有的: 和 显然,因为部分字符串匹配,所以正在正确地执行某些操作,但

  • 问题内容: 我在Java中有以下代码: 以及C#中的以下代码: 字节数组“ secretKey”和“ bytes”是等效的,但字节数组“ rawHmac”不同,字符串“ result”不同。谁能看到原因? 问题答案: 不要这样做: 这将使用平台默认编码将字符串转换为字节数组。平台之间可能会有所不同,而您想要一些可重复的东西。我建议使用UTF-8: (当然,对密钥执行相同的操作。) 然后,您应该在C

  • 本文向大家介绍PHP实现的最大正向匹配算法示例,包括了PHP实现的最大正向匹配算法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP实现的最大正向匹配算法。分享给大家供大家参考,具体如下: 正向最大匹配算法:从左到右将待分词文本中的几个连续字符与词表匹配,如果匹配上,则切分出一个词。但这里有一个问题:要做到最大匹配,并不是第一次匹配到就可以切分的 。 函数中包含三个参数: $que

  • 本文向大家介绍PHP实现与java 通信的插件使用教程,包括了PHP实现与java 通信的插件使用教程的使用技巧和注意事项,需要的朋友参考一下 由于公司这块项目需要和java对接的一些东西 又不想用webservice 所以弄了个php模块 折腾了好长时间编译一直过不去. 索性就把源码修改了.经测试可用. 另外附一份我的安装记录 让大家少走一些弯路 另外这玩意需要安装java   直接去官网下载就