⑴ 登录加密
使用sha256加密方式
原理:前端获取随机值,进行多次加密后下发给后端比对后端同样方式加密出来的密码的结果是否一致。
Sha256加密的出来的数据是不可逆的没有解密。
import CryptoJS from "crypto-js";//使用crypto-js的moles
//对密码进行加密
let encryptedPwd = encodePwd(password, {
challenge: Challenge,//先获取的随机值
userName:username,
salt: '',
iIterate: 20 //加密20次
}, false);
//密码加密
encodePwd(szPwd, encodeParam, bIrreversible) {
let encodeKey = '';
//secretKey is challenge
encodeKey = this.sha256(szPwd) + challenge;
for (let i = 1; i < encodeParam.iIterate; i++) {
encodeKey = this.sha256(encodeKey);
return encodeKey; //返回加密结果
}
⑵ hmac-sha256-hex算法怎么调用
题主可以考虑使用CryptoJS这个库,包含很多种加密方式,而且采用了RequireJS,既支持NodeJS服务端也支持普通浏览器客户端。文档写的也很详实。GitHub传送门:/brix/crypto-js
⑶ 关于腾讯云短信接口的sig字段,sha256加密问题,nodejs
按照我下面的写法哈:
constcrypto=require('crypto');
functionsig()
{
varstrMobile="这里是我的手机";//tel的mobile字段的内容
varstrAppKey="这里是我的key";//sdkappid对应的appkey,需要业务方高度保密
varstrRand="7226249334";//url中的random字段的值
varstrTime="1457336869";//unix时间戳
varbuf="appkey="+strAppKey+"&random="+strRand+"&time="
+strTime+"&mobile="+strMobile;
varsig=crypto.createHash('sha256').update(buf,'utf-8').digest('hex');
returnsig;
}
console.log(sig());
输出结果如下:
原因就是文档里面强调了编码要使用 utf-8,而 js 默认编码不是这个,所以需要强制指定下。
另外这个 sig 的计算结果是和你的输出参数有关的,并不是不变的。
还有就是你的 mobile 和 appkey 怎么传递的都是中文,官方给的貌似都是数字和字母呃。
⑷ 在C#中的sha256加密和js中的sha256加密
C#自带的类库实现sha265会返回一个byte[] 数组
这个数组的长度是32,js的sha265是64,是把每个byte直接转换成了2个hex字符串。
C#中加密后是44位是因为把这个数组用base64编码成了字符串。
C#中也直接把byte转换成对应的hex字符串就和js中一样了。
另外,把str转换成byte[]数组的Encoding 如果不同,sha是不同的,一般js的都是utf8.
请参考
publicstaticstringSHA256(stringstr)
{
//如果str有中文,不同Encoding的sha是不同的!!
byte[]SHA256Data=Encoding.UTF8.GetBytes(str);
SHA256ManagedSha256=newSHA256Managed();
byte[]by=Sha256.ComputeHash(SHA256Data);
returnBitConverter.ToString(by).Replace("-","").ToLower();//64
//returnConvert.ToBase64String(by);//44
}
staticvoidMain(string[]args)
{
strings="helloworld";
//sha265=
stringsha=SHA256(s);
Console.WriteLine("{0} {1} Length:{2}",s,sha,sha.Length);
}