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 ...
随机推荐
- bitset用法小结
bitset bitset大概就是类似于bool数组一样的东西 但是它的每个位置只占1bit(特别特别小) bitset的原理大概是将很多数压成一个,从而节省空间和时间(暴力出奇迹) 一般来说bits ...
- C# 生成随机索引列表
/// <summary> /// 生成随机索引列表 /// </summary> /// <param name="maxNumber">&l ...
- pthread_exit在main线程中的用处
在main线程中调用pthread_exit会起到只让main线程退出,但是保留进程资源,供其他由main创建的线程使用,直至所有线程都结束,但在其他线程中不会有这种效果 https://stacko ...
- [Web][DreamweaverCS6][高中同学毕业分布去向网站+服务器上挂载]一、安装与破解DreamweaverCS6+基本规划
DreamweaverCS6安装与破解 一.背景介绍:同学毕业分布图项目计划简介 哎哎哎,炸么说呢,对于Web前端设计来说,纯手撕html部分代码实在是难受. 对于想做地图这类的就“必须”用这个老工具 ...
- Prometheus Operator 架构 - 每天5分钟玩转 Docker 容器技术(178)
本节讨论 Prometheus Operator 的架构.因为 Prometheus Operator 是基于 Prometheus 的,我们需要先了解一下 Prometheus. Prometheu ...
- sqlserver常用数据类型(精炼版)
一:系统数据类型 2.浮点数据类型 3.字符数据类型 4.日期和时间数据类型 5.文本和图形数据类型 6.货币数据类型 7.位数据类型 8.二进制数据类型 9.其他数据类型 二:自定义数据类型 数 ...
- 使用Linq的泛型功能
泛型数据访问类: 业务抽象类使用数据访问类: 业务类继承业务抽象类: 使用业务类:
- 0e开头的md5收集 --------PHP加密模块bug
————————————————md5加密—————————————— s878926199a s155964671a s214587387a s214587387a s878926199a s109 ...
- Django REST framework基础:视图和路由
DRF中的Request 在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 比如,区别于Dj ...
- Django REST framework基础:序列化
表结构: class Article(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(m ...