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

java hmac / sha512生成

琴刚豪
2023-03-14
问题内容

我有这个生成 HMAC (而不是简单的消息摘要)的php代码:

<?php 
$key = "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF";
$binkey = pack("H*", $key); 
echo strtoupper(hash_hmac('sha512', "ABC", $binkey)); 
?>

并与ABC输入输出是:

100A6A016A4B21AE120851D51C93B293D95B7D8A44B16ACBEFC2D1C9DF02B6F54FA3C2D6802E52FED5DF8652DDD244788A204682D2D1CE861FDA4E67F2792643

我需要在Java中将其克隆。

所以这是我当前的Java克隆:

private String generateHMAC( String datas )
    {

        //                final Charset asciiCs = Charset.forName( "utf-8" );
        Mac mac;
        String result = "";
        try
        {
            byte[] bytesKey = PayboxConstants.KEY.getBytes( );
            final SecretKeySpec secretKey = new SecretKeySpec( bytesKey, "HmacSHA512" );
            mac = Mac.getInstance( "HmacSHA512" );
            mac.init( secretKey );
            final byte[] macData = mac.doFinal( datas.getBytes( ) );
            byte[] hex = new Hex( ).encode( macData );
            result = new String( hex, "ISO-8859-1" );
        }
        catch ( final NoSuchAlgorithmException e )
        {
            AppLogService.error( e );
        }
        catch ( final InvalidKeyException e )
        {
            AppLogService.error( e );
        }
        catch ( UnsupportedEncodingException e )
        {
            AppLogService.error( e );
        }

        return result.toUpperCase( );

    }

但这并不能完成工作,因为对于相同的输入(ABC),其输出为:

AA6492987D7A7AC81109E877315414806F1973CC47B897ECE713171A25A11B279329B1BFF39EA72A5EFB7EDCD71D1F34D5AAC49999A780BD13F019ED99685B80

我尝试了很多其他的Java代码,但没有一个是php版本的精确克隆。

我做错什么了?


问题答案:

您只是忘了模仿pack()Java代码中的行为(无论您需要使用什么)。

final SecretKeySpec secretKey = new SecretKeySpec( DatatypeConverter.parseHexBinary(PayboxConstants.KEY), "HmacSHA512" );

在您的Java代码中。

DatatypeConverter.parseHexBinary()从JAXB
API

另外,如果您不想仅出于将HEX字符串转换为字节的目的而包含JAXB,则可能要使用此处发布的代码。



 类似资料:
  • import "crypto/sha512" sha512包实现了SHA384和SHA512哈希算法,参见FIPS 180-2。 Constants func Sum512(data []byte) [Size]byte func New() hash.Hash func Sum384(data []byte) (sum384 [Size384]byte) func New384() hash.H

  • 问题内容: 我正在使用GoLang中的授权模块。在我们将PHP5与crypt函数一起使用之前。哈希生成类似于SHA-512: 并像这样存储在数据库中。但是现在我需要使其在GoLang中也能正常工作。我在Google上进行了搜索,并尝试了不同的方法,例如: 但是所有产生的东西都不一样。谁能进一步帮助我们? 我们要验证并创建类似php版本的哈希。 提前致谢。 问题答案: https://github.

  • 我知道RSA密钥可以使用不同的算法生成。使用,我似乎无法指定密钥生成器应该使用什么算法。我怀疑它使用的是。 如何在bashshell或Ruby中使用不同的算法(例如)生成RSA密钥?库是否支持使用不同的算法生成RSA密钥?如果没有,有人知道我可以使用另一个图书馆吗?(在ruby中,似乎不允许选择算法,但文档对我来说很难遵循soo…?) 很抱歉,如果这个问题已经得到了回答,但我还没有找到答案。 也许

  • 我尝试了很多其他java代码,但没有一个是php版本的完全克隆。 我做错了什么?

  • 我正在迁移一个使用Passlib 1.6.2生成密码哈希的平台。加密密码的代码是(调用哈希时使用轮次的默认值): 输出格式如下所示(对于密码“patient3”(无引号)): 我看得出来代表着: 算法SHA512 迭代10001 盐0DR7V7EWUMPTRFW.9Z6HKA(可能) Passlib算法是在他们的站点上定义的,它的内容如下:

  • 我有以下PHP代码: 如何在android(java)中实现同样的功能。 我已经尝试了hmac sha512可用的几种方法,但php代码段的结果与我的不同。 提前致谢