最近工作中涉及到关于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加密方式。于是,研究了下sha256和hmac_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 对应 php 的 sha256 加签工具
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()函数将字符串转换为大...