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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 平均数、中位数和众数及它们之间的关系

    平均数、中位数和众数及它们之间的关系迁移到:http://www.bdata-cap.com/newsinfo/1741421.html本文内容平均数中位数众数参考资料演示最近大BOSS“迷上”了一个网络游戏(什么游戏就

    2022年7月2日
    35
  • mac配置vscodec语言环境_vscodejava环境变量配置

    mac配置vscodec语言环境_vscodejava环境变量配置登陆终端输入java-version查看java的版本输入java-verbose查看java的安装环境路径没有的话,自己去搜一下怎么安装java的jdk,记得选1.18版本安装路径在这里安装完jdk后,输入/usr/libexec/java_home-V查看jdk版本复习什么是JDKJavaDevelopmentKit开发工具包包含Java开发工具和JREjava开发工具:编译工具javac.exe,jar.exe打包工具等。JRE=JVM+javaS

    2022年10月3日
    6
  • 新装的CentOS 7安装python3[通俗易懂]

    新装的CentOS 7安装python3[通俗易懂]centos7自带有python,但是确实python2版本的python,如果你想安装个python3怎么办呢?难道要从github上把源码clone下来进行编译安装么?这么做对于我们个人用户来说,完全没必要嘛。1.首先,你要知道系统现在的python的位置在哪儿:[root@root~]#whereispythonpython:/usr/bin/python2.7/

    2022年6月26日
    30
  • db2有没有rownum_row_number() over order by

    db2有没有rownum_row_number() over order byrank和rownumber都是自动生成序号,后面都可以跟partitionby分组和orderby排序。不同之处在于,rownumber在orderby后面的字段,排序字段数值相等时,rownumber字段依次递增。   rank在orderby后面的字段,排序字段数值相等时,rownumber都相同,直接跳到下一个不同的序号。selectrank

    2022年5月3日
    86
  • 虚拟机开启就会蓝屏的解决方法是_虚拟机无限蓝屏

    虚拟机开启就会蓝屏的解决方法是_虚拟机无限蓝屏VMware与win10(专业版)不兼容的问题前两天系统出了点问题,然后重置了系统,结果今天装VMware的时候发现一开虚拟机就蓝屏了。一、首先打开控制面板,找到启动或关闭Windows功能二、打开win+R,输入gpedit.msc三、打开控制面板>程序>查看已安装的更新,卸载最近的更新。总结前两天系统出了点问题,然后重置了系统,结果今天装VMware的时候发现一开虚拟机就蓝屏了。找了好些方法,重启了十几次电脑,后面才弄好提示:以下是本篇文章正文内容,下面案例可供参考一、首先打开控制

    2025年9月6日
    6
  • mac pycharm 配置python「建议收藏」

    mac pycharm 配置python「建议收藏」macpycharm配置python一、首先查看自己安装的python的路径  在terminal运行whichpython(which命令只是根据PATH环境变量找)  例如:/usr/bin/python二、设置python版本  1>Pycharm-Preference-Build,Deployment-PythonConsole-Pythoninterprete

    2022年8月29日
    6

发表回复

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

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