Java SHA256/Base64转.NET(C#)实现---(华为云云市场.NET版本加密方式)
2024-09-04 17:38:50
前言:
工作需要,对接华为云应用市场的 API 接口,由于维护团队都是 .NET 所以用 .NET 来开发。
简单了解一下 SHA256 加密算法,本质就是一个 Hash,与 MD5 相比就是计算量大一些,具体的没时间细化。
一、Java SHA256 加密算法实现代码 (最终以 Base64 方式进行签名验证)
/**
*
* hamcSHA256加密算法
* @param macKey 秘钥key
* @param macData 加密内容-响应消息体
* @return 加密密文
* @throws NoSuchAlgorithmException
* @throws InvalidKeyException
* @throws IllegalStateException
* @throws UnsupportedEncodingException
*/
public static byte[] hmacSHA256(String macKey, String macData) throws NoSuchAlgorithmException, InvalidKeyException, IllegalStateException, UnsupportedEncodingException { SecretKeySpec secret = new SecretKeySpec(macKey.getBytes(), "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(secret); byte[] doFinal = mac.doFinal(macData.getBytes("UTF-8"));
return doFinal;
}
/**
*
* 字节数组转字符串
* @param bytes 字节数组
* @return 字符串
*/
public static String base_64(byte[] bytes)
{
return new String(Base64.encodeBase64(bytes));
}
二、.NET SHA256 加密算法实现代码
/// <summary>
/// hamcSHA256加密实现
/// </summary>
/// <returns>The token.</returns>
/// <param name="secret">Secret.</param>
/// <param name="message">Message.</param>
public static string CreateToken(string secret, string message)
{
var encoding = new System.Text.ASCIIEncoding();
byte[] keyByte = encoding.GetBytes(secret);
// 注意:如果是中文注意转换编码格式
byte[] messageBytes = encoding.GetBytes(message);
using (var hmacsha256 = new HMACSHA256(keyByte))
{
byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
// 注意:Java (u127)与.NET byte(255) 存储方式不同,所以需要转换一下。
sbyte[] sb = new sbyte[hashmessage.Length];
for (int i = ; i < hashmessage.Length; i++) {
sb[i] = hashmessage[i] < ? (sbyte)hashmessage[i] : (sbyte)(hashmessage[i] - );
} byte[] unsignedByteArray = (byte[])(Array)sb;
return Convert.ToBase64String(unsignedByteArray);
}
}
问题总结:
1、转 byte[] 数组,注意编码格式;
2、Java 中的 byte 与 .NET 中的 byte 存储方式不同,Java 是 -127~127、.NET 是 0~2555
3、转换 Base64 同样,如果不进行转换结果会不一致,采用 sbyte[] 进行一轮转换再 Base64;
最新文章
- 雪峰配置的nginx
- ubuntu 环境变量修改和恢复总结[收藏]
- MongoVUE 如何导出数据
- mac 学习
- 第10条:始终要覆盖toString
- C语言中结构体对齐问题
- 工厂模式 - 程序实现(java)
- 一元云购完整源码 云购CMS系统 带安卓和ios手机客户端
- King&#39;s Quest - poj 1904(强连通分量+外挂输入输出)
- 【Linux】CentOS系统
- Haskell 笔记(三)类型系统
- 6.Hibernate单向的多对一 关联映射
- The Wall (medium)
- JS数组(JSON)整合篇-方法整理
- 在Bootstrap开发框架中使用dataTable直接录入表格行数据(2)--- 控件数据源绑定
- 接口请求,上传byte数组byte[]数据异常,负数变正数/负数变63
- python学习第四次笔记
- SQL_sql语言的学习
- Hibernate学习笔记一:项目创建与基本配置文件
- 【转载】【JAVA秒会技术之图片上传】基于Nginx及FastDFS,完成图片的上传及展示
热门文章
- 使用 Task 简化异步编程
- Java中Map用法详解
- Python 新手常犯错误(第一部分)转载
- php 单线程 (http://bbs.csdn.net/topics/390778072)
- PKU 1094 Sorting It All Out(拓扑排序)
- 什么是“HTML”?HTML的“标记”是什么?
- 分布式存储系统 Ceph
- 对称加密与非对称加密,以及RSA的原理
- LeetCode (226):Invert Binary Tree 递归实现
- Hive架构