C#、Java和JS实现SHA256+BASE64加密总结
C#、Java和JS实现SHA256+BASE64加密总结
--莫非(www.muphy.me)
原理
首先,通过编码格式(UTF-8、ASCII等,如果含有汉字等字符,编码格式不同加密结果也不同)获得加密字符串的字节数组,再计算字节数组的哈希值数组,再把hash数组转换为base64编码的字符串。
C#实例
class Program
{//转换为base64编码为44位
public static string NewSHA256(string str)
{
//如果str有中文,不同Encoding的sha是不同的!!
using (SHA256Managed sha256 = new SHA256Managed())
{
byte[] SHA256Data =Encoding.UTF8.GetBytes(str);
//SHA256Data "104,101,108,108,111,32,119,111,114,108,100"
byte[] by =sha256.ComputeHash(SHA256Data);
//44位 "uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek="
return Convert.ToBase64String(by);
}
}
//转换为十六进制编码为64位 去除了‘-’
public static string SHA256(string str)
{ //如果str有中文,不同Encoding的sha是不同的!!
using (SHA256Managed sha256 = new SHA256Managed())
{
byte[] SHA256Data =Encoding.UTF8.GetBytes(str);
//SHA256Data "104,101,108,108,111,32,119,111,114,108,100"
byte[] by =sha256.ComputeHash(SHA256Data);
//64位 "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"
return BitConverter.ToString(by).Replace("-", "").ToLower();
}
}
static void Main(string[] args)
{
string s = "hello world";
//sha265:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
string sha = SHA256(s);
Console.WriteLine("{0}\n{1} \nLength: {2}", s, sha,sha.Length);
//结果 ”uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek=”
}
}
Java实例
/**
* 利用java原生的摘要实现SHA256加密
*@param str 加密后的报文
*@return
*/
public static String getSHA256StrJava(String str){
MessageDigest messageDigest;
String encodeStr = "";
try {
messageDigest =MessageDigest.getInstance("SHA-256");
messageDigest.update(str.getBytes("UTF-8"));
//转换的方式选择
//encodeStr = byte2Hex(messageDigest.digest());//转换成二进制
encodeStr =base64Entrypt(messageDigest.digest());//转换成Base64
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return encodeStr;
}
/**
*将byte转为16进制
*@param bytes
*@return
*/
private static String byte2Hex(byte[] bytes){
StringBuffer stringBuffer = new StringBuffer();
String temp =null;
for (int i=;i<bytes.length;i++){
temp =Integer.toHexString(bytes[i] & 0xFF);
if (temp.length()==){
//1得到一位的进行补0操作
stringBuffer.append("");
}
stringBuffer.append(temp);
}
return stringBuffer.toString();
}
/**
*转换为BASE64编码
*@param bytes
*@return
*/
private static String base64Entrypt(byte[] bytes){
//import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
return Base64.encode(bytes);
}
private static String newBase64Entrypt(byte[] bytes){
//import sun.misc.BASE64Encoder;
return new BASE64Encoder().encode(bytes);
}
/**
*测试
*@param Args
*/
public static void main(String[] Args){
String str = "hello world";
String sha = getSHA256StrJava(str);
System.out.println(str + ":" + sha);
//结果:hello world:uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek=
}
JS实例
/**
*SHA256加密
*/
function SHA256(s) {
var chrsz = 8;
var hexcase = 0;
function safe_add(x, y) {
var lsw =(x & 0xFFFF) + (y & 0xFFFF);
var msw =(x >> 16) + (y >> 16) + (lsw >> 16);
return (msw << 16) | (lsw &0xFFFF);
}
function S(X, n) {
return (X >>> n) | (X <<(32 - n));
}
function R(X, n) {
return (X >>> n);
}
function Ch(x, y, z) {
return ((x & y) ^ ((~x) & z));
}
function Maj(x, y, z) {
return ((x & y) ^ (x & z) ^ (y & z));
}
function Sigma0256(x) {
return (S(x, 2) ^ S(x, 13) ^ S(x, 22));
}
function Sigma1256(x) {
return (S(x, 6) ^ S(x, 11) ^ S(x, 25));
}
function Gamma0256(x) {
return (S(x, 7) ^ S(x, 18) ^ R(x, 3));
}
function Gamma1256(x) {
return (S(x, 17) ^ S(x, 19) ^ R(x, 10));
}
function core_sha256(m, l) {
var K = new Array(0x428A2F98, 0x71374491, 0xB5C0FBCF,0xE9B5DBA5,
0x3956C25B, 0x59F111F1, 0x923F82A4,0xAB1C5ED5, 0xD807AA98,
0x12835B01, 0x243185BE,0x550C7DC3, 0x72BE5D74, 0x80DEB1FE,
0x9BDC06A7, 0xC19BF174,0xE49B69C1, 0xEFBE4786, 0xFC19DC6,
0x240CA1CC, 0x2DE92C6F,0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
0x983E5152, 0xA831C66D, 0xB00327C8,0xBF597FC7, 0xC6E00BF3,
0xD5A79147, 0x6CA6351, 0x14292967,0x27B70A85, 0x2E1B2138,
0x4D2C6DFC, 0x53380D13,0x650A7354, 0x766A0ABB, 0x81C2C92E,
0x92722C85, 0xA2BFE8A1,0xA81A664B, 0xC24B8B70, 0xC76C51A3,
0xD192E819, 0xD6990624, 0xF40E3585,0x106AA070, 0x19A4C116,
0x1E376C08, 0x2748774C,0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A,
0x5B9CCA4F, 0x682E6FF3,0x748F82EE, 0x78A5636F, 0x84C87814,
0x8CC70208, 0x90BEFFFA,0xA4506CEB, 0xBEF9A3F7, 0xC67178F2);
var HASH =new Array(0x6A09E667,0xBB67AE85, 0x3C6EF372, 0xA54FF53A,
0x510E527F, 0x9B05688C,0x1F83D9AB, 0x5BE0CD19);
var W = new Array(64);
var a, b, c, d, e, f, g, h, i, j;
var T1, T2;
m[l >> 5] |= 0x80 <<(24 - l % 32);
m[((l + 64 >> 9) << 4) +15] = l;
for (var i = 0;i < m.length; i += 16) {
a = HASH[0];
b = HASH[1];
c = HASH[2];
d = HASH[3];
e = HASH[4];
f = HASH[5];
g = HASH[6];
h = HASH[7];
for (var j = 0;j < 64; j++) {
if (j < 16)
W[j] = m[j + i];
else
W[j] =safe_add(safe_add(safe_add(Gamma1256(W[j - 2]),
W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]);
T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(
e, f, g)), K[j]), W[j]);
T2 = safe_add(Sigma0256(a), Maj(a, b, c));
h = g;
g = f;
f = e;
e = safe_add(d, T1);
d = c;
c = b;
b = a;
a = safe_add(T1, T2);
}
HASH[0] = safe_add(a, HASH[0]);
HASH[1] = safe_add(b, HASH[1]);
HASH[2] = safe_add(c, HASH[2]);
HASH[3] = safe_add(d, HASH[3]);
HASH[4] = safe_add(e, HASH[4]);
HASH[5] = safe_add(f, HASH[5]);
HASH[6] = safe_add(g, HASH[6]);
HASH[7] = safe_add(h, HASH[7]);
}
return HASH;
}
function str2binb(str) {
var bin =Array();
var mask =(1 << chrsz) - 1;
for (var i = 0;i < str.length * chrsz; i += chrsz) {
bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i % 32);
}
return bin;
}
function Utf8Encode(string) {
string = string.replace(/\r\n/g, "\n");
var utftext = "";
for (var n = 0;n < string.length; n++) {
var c =string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
} else if ((c > 127) && (c <2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
} else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
}
function binb2hex(binarray) {
var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
var str = "";
for (var i = 0;i < binarray.length * 4; i++) {
str += hex_tab
.charAt((binarray[i >> 2] >> ((3 - i %4) * 8 + 4)) & 0xF)
+ hex_tab.charAt((binarray[i>> 2] >> ((3 - i % 4) * 8)) & 0xF);
}
return str;
}
s =Utf8Encode(s);
return binb2hex(core_sha256(str2binb(s), s.length *chrsz));
}
C#、Java和JS实现SHA256+BASE64加密总结
--莫非(www.muphy.me)
原理
首先,通过编码格式(UTF-8、ASCII等,如果含有汉字等字符,编码格式不同加密结果也不同)获得加密字符串的字节数组,再计算字节数组的哈希值数组,再把hash数组转换为base64编码的字符串。
C#实例
class Program
{//转换为base64编码为44位
public static string NewSHA256(string str)
{
//如果str有中文,不同Encoding的sha是不同的!!
using (SHA256Managed sha256 = new SHA256Managed())
{
byte[] SHA256Data =Encoding.UTF8.GetBytes(str);
//SHA256Data "104,101,108,108,111,32,119,111,114,108,100"
byte[] by =sha256.ComputeHash(SHA256Data);
//44位 "uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek="
return Convert.ToBase64String(by);
}
}
//转换为十六进制编码为64位 去除了‘-’
public static string SHA256(string str)
{ //如果str有中文,不同Encoding的sha是不同的!!
using (SHA256Managed sha256 = new SHA256Managed())
{
byte[] SHA256Data =Encoding.UTF8.GetBytes(str);
//SHA256Data "104,101,108,108,111,32,119,111,114,108,100"
byte[] by =sha256.ComputeHash(SHA256Data);
//64位 "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"
return BitConverter.ToString(by).Replace("-", "").ToLower();
}
}
static void Main(string[] args)
{
string s = "hello world";
//sha265:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
string sha = SHA256(s);
Console.WriteLine("{0}\n{1} \nLength: {2}", s, sha,sha.Length);
//结果 ”uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek=”
}
}
Java实例
/**
* 利用java原生的摘要实现SHA256加密
*@param str 加密后的报文
*@return
*/
public static String getSHA256StrJava(String str){
MessageDigest messageDigest;
String encodeStr = "";
try {
messageDigest =MessageDigest.getInstance("SHA-256");
messageDigest.update(str.getBytes("UTF-8"));
//转换的方式选择
//encodeStr = byte2Hex(messageDigest.digest());//转换成二进制
encodeStr =base64Entrypt(messageDigest.digest());//转换成Base64
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return encodeStr;
}
/**
*将byte转为16进制
*@param bytes
*@return
*/
private static String byte2Hex(byte[] bytes){
StringBuffer stringBuffer = new StringBuffer();
String temp =null;
for (int i=0;i<bytes.length;i++){
temp =Integer.toHexString(bytes[i] & 0xFF);
if (temp.length()==1){
//1得到一位的进行补0操作
stringBuffer.append("0");
}
stringBuffer.append(temp);
}
return stringBuffer.toString();
}
/**
*转换为BASE64编码
*@param bytes
*@return
*/
private static String base64Entrypt(byte[] bytes){
//import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
return Base64.encode(bytes);
}
private static String newBase64Entrypt(byte[] bytes){
//import sun.misc.BASE64Encoder;
return new BASE64Encoder().encode(bytes);
}
/**
*测试
*@param Args
*/
public static void main(String[] Args){
String str = "hello world";
String sha = getSHA256StrJava(str);
System.out.println(str + ":" + sha);
//结果:hello world:uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek=
}
JS实例
/**
*SHA256加密
*/
function SHA256(s) {
var chrsz = 8;
var hexcase = 0;
function safe_add(x, y) {
var lsw =(x & 0xFFFF) + (y & 0xFFFF);
var msw =(x >> 16) + (y >> 16) + (lsw >> 16);
return (msw << 16) | (lsw &0xFFFF);
}
function S(X, n) {
return (X >>> n) | (X <<(32 - n));
}
function R(X, n) {
return (X >>> n);
}
function Ch(x, y, z) {
return ((x & y) ^ ((~x) & z));
}
function Maj(x, y, z) {
return ((x & y) ^ (x & z) ^ (y & z));
}
function Sigma0256(x) {
return (S(x, 2) ^ S(x, 13) ^ S(x, 22));
}
function Sigma1256(x) {
return (S(x, 6) ^ S(x, 11) ^ S(x, 25));
}
function Gamma0256(x) {
return (S(x, 7) ^ S(x, 18) ^ R(x, 3));
}
function Gamma1256(x) {
return (S(x, 17) ^ S(x, 19) ^ R(x, 10));
}
function core_sha256(m, l) {
var K = new Array(0x428A2F98, 0x71374491, 0xB5C0FBCF,0xE9B5DBA5,
0x3956C25B, 0x59F111F1, 0x923F82A4,0xAB1C5ED5, 0xD807AA98,
0x12835B01, 0x243185BE,0x550C7DC3, 0x72BE5D74, 0x80DEB1FE,
0x9BDC06A7, 0xC19BF174,0xE49B69C1, 0xEFBE4786, 0xFC19DC6,
0x240CA1CC, 0x2DE92C6F,0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
0x983E5152, 0xA831C66D, 0xB00327C8,0xBF597FC7, 0xC6E00BF3,
0xD5A79147, 0x6CA6351, 0x14292967,0x27B70A85, 0x2E1B2138,
0x4D2C6DFC, 0x53380D13,0x650A7354, 0x766A0ABB, 0x81C2C92E,
0x92722C85, 0xA2BFE8A1,0xA81A664B, 0xC24B8B70, 0xC76C51A3,
0xD192E819, 0xD6990624, 0xF40E3585,0x106AA070, 0x19A4C116,
0x1E376C08, 0x2748774C,0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A,
0x5B9CCA4F, 0x682E6FF3,0x748F82EE, 0x78A5636F, 0x84C87814,
0x8CC70208, 0x90BEFFFA,0xA4506CEB, 0xBEF9A3F7, 0xC67178F2);
var HASH =new Array(0x6A09E667,0xBB67AE85, 0x3C6EF372, 0xA54FF53A,
0x510E527F, 0x9B05688C,0x1F83D9AB, 0x5BE0CD19);
var W = new Array(64);
var a, b, c, d, e, f, g, h, i, j;
var T1, T2;
m[l >> 5] |= 0x80 <<(24 - l % 32);
m[((l + 64 >> 9) << 4) +15] = l;
for (var i = 0;i < m.length; i += 16) {
a = HASH[0];
b = HASH[1];
c = HASH[2];
d = HASH[3];
e = HASH[4];
f = HASH[5];
g = HASH[6];
h = HASH[7];
for (var j = 0;j < 64; j++) {
if (j < 16)
W[j] = m[j + i];
else
W[j] =safe_add(safe_add(safe_add(Gamma1256(W[j - 2]),
W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]);
T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(
e, f, g)), K[j]), W[j]);
T2 = safe_add(Sigma0256(a), Maj(a, b, c));
h = g;
g = f;
f = e;
e = safe_add(d, T1);
d = c;
c = b;
b = a;
a = safe_add(T1, T2);
}
HASH[0] = safe_add(a, HASH[0]);
HASH[1] = safe_add(b, HASH[1]);
HASH[2] = safe_add(c, HASH[2]);
HASH[3] = safe_add(d, HASH[3]);
HASH[4] = safe_add(e, HASH[4]);
HASH[5] = safe_add(f, HASH[5]);
HASH[6] = safe_add(g, HASH[6]);
HASH[7] = safe_add(h, HASH[7]);
}
return HASH;
}
function str2binb(str) {
var bin =Array();
var mask =(1 << chrsz) - 1;
for (var i = 0;i < str.length * chrsz; i += chrsz) {
bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i % 32);
}
return bin;
}
function Utf8Encode(string) {
string = string.replace(/\r\n/g, "\n");
var utftext = "";
for (var n = 0;n < string.length; n++) {
var c =string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
} else if ((c > 127) && (c <2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
} else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
}
function binb2hex(binarray) {
var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
var str = "";
for (var i = 0;i < binarray.length * 4; i++) {
str += hex_tab
.charAt((binarray[i >> 2] >> ((3 - i %4) * 8 + 4)) & 0xF)
+ hex_tab.charAt((binarray[i>> 2] >> ((3 - i % 4) * 8)) & 0xF);
}
return str;
}
s =Utf8Encode(s);
return binb2hex(core_sha256(str2binb(s), s.length *chrsz));
}
C#、Java和JS实现SHA256+BASE64加密总结的更多相关文章
- JS URL 使用base64加密与解密
JS编码方式: <script type="text/javascript"> document.write(encodeURI("http://www.w3 ...
- JS URL 使用base64加密与解密和MD5解密
JS编码方式: <script type="text/javascript"> document.write(encodeURI("http://www.w3 ...
- js中变量base64加密传输
首先对base64进行定义: var Base64 = { _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01 ...
- JS实现的base64加密、md5加密及sha1加密详解
1.base64加密 在页面中引入base64.js文件,调用方法为: <!DOCTYPE HTML> <html> <head> <meta charset ...
- js中实现base64加密、解密
//base64加密 解密 /* //1.加密 var result = Base.encode('125中文'); //--> "MTI15Lit5paH" //2.解密 ...
- 【js】JS实现的base64加密、md5加密及sha1加密详解
参考链接 http://www.jb51.net/article/82831.htm
- Java 和JS Base64加密
项目在登录.注册等场景实现时,经常会用到用户信息前端加密,然后项目后端二次解密,避免信息直接在浏览器上以明文显示. 本文主要介绍了base64加密的方式处理代码,不支持中文 源码如下: base64. ...
- js base64加密,后台解密
这是为了解决页面发送post请求,传输密码,在页面的控制台可以看到密码的明文,所以先用base64把要传输的密码转换为非明文,然后在后台解密处理. base64encode.js // base64加 ...
- jquery对中文进行base64加密,后台用java进行base64解密
项目中遇到将中文从前台传到后台过程中,出现乱码,一番尝试之后,均是乱码,然后尝试在js代码中先进行base64加密,然后在Java中再进行解密,完美的解决了乱码问题,步骤如下 一,html页面引入jQ ...
随机推荐
- 后端开发者的Vue学习之路(三)
目录 上节内容回顾 组件 什么是组件 组件注册 全局注册组件 局部注册组件 使用细节 组件注册的命名规范: 组件中只有一个根元素 组件也是一个实例 组件在某些元素中渲染出错 组件间的数据传递 父子组件 ...
- #WEB安全基础 : HTML/CSS | 0x7HTML5和W3C验证
标准,标准,什么都有标准 你听说过HTML5吗?这是一个新版本,当然也有新标准 我只准备了一个index.html文件 以下是代码 <!DOCTYPE html> <!--告诉浏览器 ...
- SAP MM 启用批次管理的物料MB21创建预留单据时批次号可以为空!
SAP MM 启用批次管理的物料MB21创建预留单据时批次号可以为空! 如下预留, 批次号字段为空. 实际上该物料是有激活batch management的, For MB21, it is just ...
- 从.Net到Java学习第七篇——SpringBoot Redis 缓存穿透
从.Net到Java学习系列目录 场景描述:我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回.这个时候如果我们查询的某一个数 ...
- AV-TEST杀毒软件能力测试(2018年1月-12月)杀毒软件排名
2018年1月到12月,AV-TEST攻击了实验室中无数的Windows系统,在830多项单独测试中测试了7种杀毒软件和5种快捷工具. 1.测试概述 在长期测试中,实验室在各种实际场景中测试了杀毒软件 ...
- gitbook 入门教程之插件介绍
插件是 gitbook 的扩展功能,很多炫酷有用的功能都是通过插件完成的,其中插件有官方插件和第三方插件之分. 推荐官方插件市场 https://plugins.gitbook.com/ 寻找或下载相 ...
- Vue一个案例引发的递归组件的使用
今天我们继续使用 Vue 的撸我们的实战项目,只有在实战中我们才会领悟更多,光纸上谈兵然并卵,继上篇我们的<Vue一个案例引发的动态组件与全局事件绑定总结> 之后,今天来聊一聊我们如何在项 ...
- 20180903 - Python Pip 工具下载whl包与离线安装
20180903 - Python Pip 工具下载whl包与离线安装 1. 我的Blog 博客园 https://www.cnblogs.com/piggybaba 个人网站 http://pigg ...
- Linux分页机制之分页机制的演变--Linux内存管理(七)
1 页式管理 1.1 分段机制存在的问题 分段,是指将程序所需要的内存空间大小的虚拟空间,通过映射机制映射到某个物理地址空间(映射的操作由硬件完成).分段映射机制解决了之前操作系统存在的两个问题: 地 ...
- c#实验一:基于winform的冒泡排序练习
一.界面设计 在排序前textbox中输入数字,以逗号隔开,通过两个button实现降序排序或升序排序,然后在排序后textbox中显示 三个关键点: 1.监测输入是否合法,最好使用正则表达式 2.拆 ...