hmacsha256 java_java实现HMACSHA256(md5私钥key)加密签名

hmacsha256 java_java实现HMACSHA256(md5私钥key)加密签名最近在练习一个 api 时要对参数进行加密 描述如下 签名机制每次请求 privateapi 都需要验证签名 发送的参数示例 param array amount 1 price 10000 type buy nonce 3key 5zi7w 4mnes swmc4 egg9b f2iqw 396z4 g541bsignatu 459c69d25c49

最近在练习一个api时要对参数进行加密,描述如下:

签名机制

每次请求private api 都需要验证签名,发送的参数示例:

$param = array(

amount =1,

price =10000,

type =‘buy’,

nonce =3

key =5zi7w-4mnes-swmc4-egg9b-f2iqw-396z4-g541b

signature =459c69d25c2dbe9dfafd9290ed82

);

nonce 可以理解为一个递增的整数:http://zh.wikipedia.org/wiki/Nonce

key 是申请到的公钥

signature是签名,是将amount price type nonce key等参数通过’&’字符连接起来通过md5(私钥)为key进行sha256算法加密得到的值.

其中关于签名的描述含糊不清,经过一天的摸索,总算搞定了,代码如下。

注意事项:

提交参数的时候一定对参数进行字典进行排序,同样加密参数的时候也要按照字典顺序排序。

public static final String PUBLIC_KEY = “qpda5-eu8uc-bta6c-qrdm4-775v7-nmymb-c1trv”;

public static final String PRIVATE_KEY = “*cVd)-6FYvS-97zEU-HT^SJ-9qd6&-Cz*md-;fpGt”;

public static void main(String[] args) {

String encryptKey;

try {

encryptKey = MD5Encrypt.getMessageDigest(PRIVATE_KEY);

System.out.println(” encryptKey : ” + encryptKey);

String str = sha256_HMAC(“key=dhdv5-eu8uc-bta6c-qrdm4-775v7-nmymb-c1trv&nonce=0”, encryptKey);

System.out.println(” getSignature : ” + str);

} catch (NoSuchAlgorithmException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

/

* 将加密后的字节数组转换成字符串

*

* @param b

*字节数组

* @return 字符串

*/

private static String byteArrayToHexString(byte[] b) {

StringBuilder hs = new StringBuilder();

String stmp;

for (int n = 0; b != null && n < b.length; n++) {

stmp = Integer.toHexString(b[n] & 0XFF);

if (stmp.length() == 1)

hs.append(‘0’);

hs.append(stmp);

}

return hs.toString().toLowerCase();

}

/

* sha256_HMAC加密

*

* @param message

*消息

* @param secret

*秘钥

* @return 加密后字符串

*/

private static String sha256_HMAC(String message, String secret) {

String hash = “”;

try {

Mac sha256_HMAC = Mac.getInstance(“HmacSHA256”);

SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), “HmacSHA256”);

sha256_HMAC.init(secret_key);

byte[] bytes = sha256_HMAC.doFinal(message.getBytes());

hash = byteArrayToHexString(bytes);

} catch (Exception e) {

System.out.println(“Error HmacSHA256 ===========” + e.getMessage());

}

return hash;

}

执行结果如下:

encryptKey : d9e7fc07ab76555e499f8ced7e

getSignature : 2601b1fab764e20c135fa0fb45705cddf3af4d2f14c

最后提供MD5Encrypt代码:

public class MD5Encrypt {

private static final String ENCODE = “UTF-8”;

private static final String ENCNAME = “MD5”;

/

* 功能:MD5加密

* @param strSrc 加密的源字符串

* @return 加密串 长度32位(hex串)

* @throws NoSuchAlgorithmException

* @throws UnsupportedEncodingException

*/

public static String getMessageDigest(String strSrc) throws NoSuchAlgorithmException, UnsupportedEncodingException {

MessageDigest md = null;

String strDes = null;

byte[] bt = strSrc.getBytes(ENCODE);

md = MessageDigest.getInstance(ENCNAME);

md.update(bt);

strDes = bytes2Hex(md.digest());

return strDes;

}

/

* 将字节数组转为HEX字符串(16进制串)

* @param bts 要转换的字节数组

* @return 转换后的HEX串

*/

public static String bytes2Hex(byte[] bts) {

String des = “”;

String tmp = null;

for (int i = 0; i < bts.length; i++) {

tmp = (Integer.toHexString(bts[i] & 0xFF));

if (tmp.length() == 1) {

des += “0”;

}

des += tmp;

}

return des;

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231009.html原文链接:https://javaforall.net

(0)
上一篇 2026年2月3日 下午3:01
下一篇 2026年2月3日 下午3:22


相关推荐

  • 《计算机网络》复习笔记

    《计算机网络》复习笔记《计算机网络》复习笔记本复习笔记基于谢希仁的《计算机网络》第五版教材整理。计算机网络复习笔记绪论1计算机网络2因特网概述3互联网的组成P84计算机网络的类别P175计算机网络的体系结构P25物理层1物理层下的传输媒体2关于信道的几个基本概念3信道复用技术数据链路层1使用点对点信道的数据链路层2点对点协议PPPP703

    2022年5月8日
    54
  • 最强DE战斗力

    最强DE战斗力

    2021年9月6日
    63
  • 小白装机进入pe后黑屏:3步快速修复指南

    小白装机进入pe后黑屏:3步快速修复指南

    2026年3月14日
    2
  • 计算机专业bs和cs,BS和CS的区别以及各自的优缺点

    计算机专业bs和cs,BS和CS的区别以及各自的优缺点CS 什么是 CS CS Client Server 指客户端 服务器架构模式 客户端需要安装专用的客户端软件 CS 的优点 特点 1 交互性强 2 存取模式安全 3 网络通信量低 4 响应速度快 5 利于处理大量数据 能充分发挥客户端 PC 的处理能力 很多工作可以在客户端处理后再提交给服务器 所以 CS 客户端响应速度快 操作界面漂亮 形式多样 可以充分满足客户自身的个性化要求 C S 结构的管理信息系统

    2026年3月19日
    1
  • c++中STL库 简介 及 使用说明

    c++中STL库 简介 及 使用说明作为 C 标准不可缺少的一部分 STL 应该是渗透在 C 程序的角角落落里的 STL 不是实验室里的宠儿 也不是程序员桌上的摆设 她的激动人心并非昙花一现 本教程旨在传播和普及 STL 的基础知识 若能借此机会为 STL 的推广做些力所能及的事情 到也是件让人愉快的事情 nbsp nbsp nbsp 初识 STL 解答一些疑问 nbsp nbsp nbsp 1 1 一个最关心的问题 什么是 STL nbsp nbsp nbsp 什么是 STL 假如你对 STL 还

    2026年3月18日
    1
  • Apache MINA框架「建议收藏」

    ApacheMINA(MultipurposeInfrastructureforNetworkApplications)是Apache组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的MINA版本支持基于JavaNIO技术的TCP/UDP应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA所支持的功能也在进一步的扩展

    2022年4月10日
    132

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号