最近工作中涉及到关于HmacSHA256加密的方式, PHP同事咨询我说无法加密,其实问题很简单,记录下来,方便那些不细心的码友们^_^。

JAVA中HmacSHA256的加密方式:

public static String SignUp(String secretKey, String plain) {
	        byte[] keyBytes = secretKey.getBytes();
	        byte[] plainBytes = plain.getBytes();
	        try {
	            Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
	            SecretKeySpec secret_key = new SecretKeySpec(keyBytes, "HmacSHA256");
	            sha256_HMAC.init(secret_key);
	            byte[] hashs = sha256_HMAC.doFinal(plainBytes);
	            StringBuilder sb = new StringBuilder();
	            for (byte x : hashs) {
	                String b = Integer.toHexString(x & 0XFF);
	                if (b.length() == 1) {
	                    b = '0' + b;
//	          sb.append(String.format("{0:x2}", x));
	                sb.append(b);
	            return sb.toString();
	            // String hash =
	            // Base64.encodeToString(sha256_HMAC.doFinal(plainBytes),
	            // Base64.DEFAULT);
//	       return hash;
	        } catch (Exception e) {
	            e.printStackTrace();
	        return null;
 

 大致分为这几部分来分析:

1. 获取SHA256实例

2. 生成一个加密key

3.通过这个加密key初始化SHA256实例

4. 根据提供的字符串,使用此实例进行加密生成hash

4. 最后整体就是转为16进制后再输出字符串

PHP部分很简单

世界上最好的语言嘛,对不对!!

function ($plain,$secretKey){ return bin2hex(hash_hmac("sha256",utf8_encode($plain) , utf8_encode($secretKey), true));

为了方便对比,我将函数参数都声明为相同的名字。

注意PHP文档中的hash_hmac的声明:   

string hash_hmac ( string $algo , string $data , string $key [, bool $raw_output = FALSE ] )
要使用的哈希算法名称,例如:"md5","sha256","haval160,4" 等。 如何获取受支持的算法清单,请参见 hash_algos()。
要进行哈希运算的消息。
使用 HMAC 生成信息摘要时所使用的密钥。
raw_output 设置为 TRUE 输出原始二进制数据, 设置为 FALSE 输出小写 16 进制字符串。
 

就因为JAVA工程师将参数跟PHP的参数传递相反,导致PHP工程师?蒙b!

Golang部分后期更新

=========Golang SHA256 HMAC Hash==========

package main
import (
    "crypto/hmac"
    "crypto/sha256"
    "encoding/hex"
    "fmt"
func main() {
    secret := "mysecret"
    data := "data"
    fmt.Printf("Secret: %s Data: %s\n", secret, data)
    // Create a new HMAC by defining the hash type and the key (as byte array)
    h := hmac.New(sha256.New, []byte(secret))
    // Write Data to it
    h.Write([]byte(data))
    // Get result and encode as hexadecimal string
    sha := hex.EncodeToString(h.Sum(nil))
    fmt.Println("Result: " + sha)
                                    我必须从这个字符串构建一个autorisation哈希:kki98hkl-u5d0-w96i-62dp-xpmr6xlvfnjz:20151110171858:b2c13532-3416-47d9-8592-a541c208f755:hKSeRD98BHngrNa51Q2IgAXtoZ8oYebgY4vQHEYjlmzN9KSbAVTRvQkUPsjOGu4F此秘密用于HMAC哈希函数:LRH9C...
                                    1、计算文件哈希值(hash) Hashpackage com.memorynotfound.file;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.security.MessageDigest;public enum Hash {MD5("MD5"),SHA1("...
使用hmac-sha256加密,然后对其返回的原始二进制数据进行base64编码。
上述示例的计算结果为: yLgHjb8GckRpZ2uW8kb0qipODRkaFCIBNQsnZ2vhGMo=
Java 代码示例:
String secre...
                                    最近,在PHP项目中使用到了hmac_sha256加密方式。于是,研究了下sha256hmac_sha256加密方式,将使用方法记录下来,为其他同学提供参考。
<?php
$params = array(
            'title' => '测试标题',
            'content' => '测试内容',
            'original' => 1,
            'subTitle' => '测试副标题',
                                    OpenJDK 12 、PHP 7.3 测试交叉验证都通过。// 原文$data = '二〇二〇年四月四日 01:43:37';// 私钥$private = <<-----BEGIN RSA PRIVATE KEY-----MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCow6pxwoAIFXWsZY3QMoUmB4uAYk0cA...
                                    java 对应 phpsha256  加签工具
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.sec...
                                    不知何故,我需要在Classic ASP中生成一个哈希,它等同于PHP的以下函数的输出:$hash = hash_hmac('SHA256', $message, pack('H*', $secret));其中$message =’stackoverflow’; $secret =’1234567890ABCDEF’;.我尝试了很多在线方法,但没有一个与PHP结果相符:bcb3452cd48c0f...
                                    在开发微信支付的时候有时候会用到签名的同步是否和微信方一致,来验证有效性,微信目前签名方式大致有两种,如下:MD5版本实现思路使用ksort()函数对参数数组按照数组键名进行升序排序使用array_filter()函数过滤掉不符合签名条件的数组值使用http_build_query()函数将数组键名与键值组合成URL字符串 对字符串进行MD5编码最后使用strtoupper()函数将字符串转换为大...