js中的web加密
js中的web加密
window.crypto.subtle只会在安全模式下有用,也就是https环境下
创建摘要(硬解)
var i = new TextEncoder('utf-8').encode("Hello World!");
crypto.subtle.digest('SHA-256', i).then(function(digest) {
var view = new DataView(digest);
var str = '';
for(var i = 0; i < view.byteLength; i++) {
var b = view.getUint8(i);
str += '0123456789abcdef'[(b & 0xf0) >> 4];
str += '0123456789abcdef'[(b & 0x0f)];
} console.log(str); // 7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069 var arr = new Uint8Array(digest);
console.log(arr);
}).catch(function(err) {
console.log(err);
})
创建摘要(软解)
const text = 'Hello World!';
const encoder = new TextEncoder();
const data = encoder.encode(text);
window.crypto.subtle.digest('SHA-256', data).then(digestValue => {
const byteArray = new Uint8Array(digestValue); const hexCodes = [...byteArray].map(value => {
const hexCode = value.toString(16);
const paddedHexCode = hexCode.padStart(2, '0');
return paddedHexCode;
}); console.log(hexCodes.join(''));
});
加密随机数
var arr = new Uint8Array(5);
crypto.getRandomValues(arr);
创建PEM格式的RSA-OAEP私钥
function arrayBufferToBase64(arrayBuffer) {
var byteArray = new Uint8Array(arrayBuffer);
var byteString = "";
for(var i = 0; i < byteArray.byteLength; i++) {
byteString += String.fromCharCode(byteArray[i]);
}
var b64 = window.btoa(byteString); return b64
} function addNewLines(str) {
var finalString = '';
while(str.length > 0) {
finalString += str.substring(0, 64) + '\n';
str = str.substring(64);
}
return finalString;
} function toPem(privateKey) {
var b64 = addNewLines(arrayBufferToBase64(privateKey));
var pem = "-----BEGIN PRIVATE KEY-----\n" + b64 + "-----END PRIVATE KEY-----"
return pem;
} window.crypto.subtle.generateKey(
{
name: "RSA-OAEP",
modulusLength: 2048,
publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
hash: {name: "SHA-256"}
},
true,
["encrypt", "decrypt"]
).then(function(keyPair){
window.crypto.subtle.exportKey("pkcs8", keyPair.privateKey).then(function(exportedPrivateKey){
var pem = toPem(exportedPrivateKey);
console.log(pem);
}).catch(function(err){
console.log(err);
})
}) 运行上面代码
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDVh3Q1faf2SSsF
M8yVqSCTgSSdEpbRepE2mzG03mq2CUpu+yGJo2U+JyqVJVorcFRBcu5fLNtXrizp
cMu5AsYSJ60HXi4us3UlIIDJm+lLVCYzD3C8bttGUglbTDo3JY1xrQ+1SVCjop33
NSBgmSl48q0zLKz9r9g7hk+cRPQ5xiDn9pP7N3tIC+dVJg+wlT79XJ4bkHQo/wA7
aNKb27MJ0pKKZXDl2iDjKxryVATunzBHbmoQ0je3iQwS2Eup9UHH/STO0Gzn81jr
0fpqtZsRSfpzBwgqKgckDQkW5TB9Bn9mhM/lnYU3PBlnea3ohLaxGc+RQy2IC4oA
3dCnHOjFAgMBAAECggEAZG6umQ4+NxgZFPxVKLuA6AAhIYQBzguRS5bZXVIT7QUX
rnWOQ7fHweEYJUiJTc8qwhH1zmxBys7Qrwfvulh0o0toFgQVQsADxG+yQ6GCrHyq
7u8/PlIB7uRdJEUJSLDwA1y7+6+9LwootIKXdPf1Sr8R+fT0dOoFkZHN1hmUqasL
ch95JLkCJZ8ELZU2IJ5H8R4qDDRiUI1/zaGAFO1DCbGNRWpqTs/MVMTp7wMh3oN0
ZYFGgmibWv8WALxpsSX+mT9JkPHn7ljlXNVWfi+J1qy8h6YcQW4nArcDPpomPIpN
9y3UfsHOHSE39d5AGEWhw2syk+PxSaKnqbW6nrGeDQKBgQD8RIPt9x5n/hnJpCaE
5o46qUrlYkIJk49t73Bqhr2k1StbaUFu9qF9G+PP/hsJRPJEWXyKvVfb6BNZsgbP
gPMbBmsXwnobd+XWqChx6HJE09obF1GSQjXov/t4nFzdNxTrXzhMjbyTw4N72CyX
1+QFZAn9GRXiben9W05XmSa5wwKBgQDYsDaVvJdR5yYU6pkcgDnr7NZ9RAMPraVz
dZvbzvIwZcOE1tBhCFODbQsPObWkLFFinaWiAUZOIIur858UJxWSCZVqgHg6bk9n
F7+Hw+4T/VnrurqNY1H4IY/5bFPqArXrat5b49CGfj/C2Se/WUG5p8bt/cY4HLbg
0HgGd7ki1wKBgQDEDKtLIKXsw7lez8dvuY4HYNHn+ri/oIHzOgXvg8+WbmRHokFL
7zgJdsdROXXhekedfr4fRI8nQ/Dl4EkSsnA8LHzF9knXVxK0A/OKss87VjlGnJS0
SeiDfc/9J+ezs776PQIP3IcVfviMIrBlQU7gMaLho8EyO6GBWJhF06wY6QKBgChv
yd/rj7mDD0I7/VKqQyTZz7UUqhWU7Bk9y1YbqmqJsxDpHX3eFeeiw7uVo2X9tzpV
/QDciAgwXqA6GGekW4wjKbT0QHt29m5gqidl0tn8H3m0IPgdnsBVUw7Svl4fH1/N
U62GN/XBPZjY+Wfl+jPxMVhcUU9LXH1bqepbETuFAoGAQiHF8bPTSqPcCQ0AvQzG
h5RK/K1LkoATXkxgJY+Te7jws6Ru/U6mFD7KDeUw3GeuSiMYZY/9eUnOq0WKfNg4
fg4S7vqYvzyISdMj77CyHhQPcnZ6KqtdBS2D3NPqf/aG9OjfftRDXe0kZP0v0YNF
DU2EjlbkOZPIVrZZ0THSUIo=
-----END PRIVATE KEY-----
使用上面创建的私钥
var pkey =
`-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDVh3Q1faf2SSsF
M8yVqSCTgSSdEpbRepE2mzG03mq2CUpu+yGJo2U+JyqVJVorcFRBcu5fLNtXrizp
cMu5AsYSJ60HXi4us3UlIIDJm+lLVCYzD3C8bttGUglbTDo3JY1xrQ+1SVCjop33
NSBgmSl48q0zLKz9r9g7hk+cRPQ5xiDn9pP7N3tIC+dVJg+wlT79XJ4bkHQo/wA7
aNKb27MJ0pKKZXDl2iDjKxryVATunzBHbmoQ0je3iQwS2Eup9UHH/STO0Gzn81jr
0fpqtZsRSfpzBwgqKgckDQkW5TB9Bn9mhM/lnYU3PBlnea3ohLaxGc+RQy2IC4oA
3dCnHOjFAgMBAAECggEAZG6umQ4+NxgZFPxVKLuA6AAhIYQBzguRS5bZXVIT7QUX
rnWOQ7fHweEYJUiJTc8qwhH1zmxBys7Qrwfvulh0o0toFgQVQsADxG+yQ6GCrHyq
7u8/PlIB7uRdJEUJSLDwA1y7+6+9LwootIKXdPf1Sr8R+fT0dOoFkZHN1hmUqasL
ch95JLkCJZ8ELZU2IJ5H8R4qDDRiUI1/zaGAFO1DCbGNRWpqTs/MVMTp7wMh3oN0
ZYFGgmibWv8WALxpsSX+mT9JkPHn7ljlXNVWfi+J1qy8h6YcQW4nArcDPpomPIpN
9y3UfsHOHSE39d5AGEWhw2syk+PxSaKnqbW6nrGeDQKBgQD8RIPt9x5n/hnJpCaE
5o46qUrlYkIJk49t73Bqhr2k1StbaUFu9qF9G+PP/hsJRPJEWXyKvVfb6BNZsgbP
gPMbBmsXwnobd+XWqChx6HJE09obF1GSQjXov/t4nFzdNxTrXzhMjbyTw4N72CyX
1+QFZAn9GRXiben9W05XmSa5wwKBgQDYsDaVvJdR5yYU6pkcgDnr7NZ9RAMPraVz
dZvbzvIwZcOE1tBhCFODbQsPObWkLFFinaWiAUZOIIur858UJxWSCZVqgHg6bk9n
F7+Hw+4T/VnrurqNY1H4IY/5bFPqArXrat5b49CGfj/C2Se/WUG5p8bt/cY4HLbg
0HgGd7ki1wKBgQDEDKtLIKXsw7lez8dvuY4HYNHn+ri/oIHzOgXvg8+WbmRHokFL
7zgJdsdROXXhekedfr4fRI8nQ/Dl4EkSsnA8LHzF9knXVxK0A/OKss87VjlGnJS0
SeiDfc/9J+ezs776PQIP3IcVfviMIrBlQU7gMaLho8EyO6GBWJhF06wY6QKBgChv
yd/rj7mDD0I7/VKqQyTZz7UUqhWU7Bk9y1YbqmqJsxDpHX3eFeeiw7uVo2X9tzpV
/QDciAgwXqA6GGekW4wjKbT0QHt29m5gqidl0tn8H3m0IPgdnsBVUw7Svl4fH1/N
U62GN/XBPZjY+Wfl+jPxMVhcUU9LXH1bqepbETuFAoGAQiHF8bPTSqPcCQ0AvQzG
h5RK/K1LkoATXkxgJY+Te7jws6Ru/U6mFD7KDeUw3GeuSiMYZY/9eUnOq0WKfNg4
fg4S7vqYvzyISdMj77CyHhQPcnZ6KqtdBS2D3NPqf/aG9OjfftRDXe0kZP0v0YNF
DU2EjlbkOZPIVrZZ0THSUIo=
-----END PRIVATE KEY-----` function removeLines(str) {
return str.replace("\n", "");
} function base64ToArrayBuffer(b64) {
var byteString = window.atob(b64);
var byteArray = new Uint8Array(byteString.length);
for(var i = 0; i < byteString.length; i++) {
byteArray[i] = byteString.charCodeAt(i);
} return byteArray;
} function pemToArrayBuffer(pem) {
var b64Lines = removeLines(pem);
var b64Prefix = b64Lines.replace("-----BEGIN PRIVATE KEY-----", '');
console.log(b64Prefix)
var b64Final = b64Prefix.replace("-----END PRIVATE KEY-----", ''); return base64ToArrayBuffer(b64Final);
} window.crypto.subtle.importKey(
"pkcs8",
pemToArrayBuffer(pkey),
{name: "RSA-OAEP", hash: {name: "SHA-256"}},
true,
['decrypt']
).then(function(importedPrivateKey){
console.log(importedPrivateKey);
}).catch(function(err){
console.log(err);
})
js中的web加密的更多相关文章
- js中变量base64加密传输
首先对base64进行定义: var Base64 = { _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01 ...
- JS中使用MD5加密
下载 MD5 使用MD5加密的方法:下载md5.js文件,在网页中引用该文件: < script type="text/javascript" src="md5.j ...
- JS中使用RSA加密信息
加密重要信息,如用户名.密码.防止http拦截.浏览器使用公钥加密,服务器端使用私钥解密 页面添加引用: jsencrypt.min.js // 3-Url参数加密类 if (window.JSE ...
- js中实现base64加密、解密
//base64加密 解密 /* //1.加密 var result = Base.encode('125中文'); //--> "MTI15Lit5paH" //2.解密 ...
- js中字符串的加密base64
base64编码主要用在传输,存储表示二进制的领域,还可以进行加密和解密.其实就是字符串的编码和解码 btoa与atob 只能加密ascii,不能加密汉字. var str = 'I LOVE YOU ...
- 【原创】js中利用cookie实现记住密码功能
在登录界面添加记住密码功能,我首先想到的是在java后台中调用cookie存放账号密码,大致如下: HttpServletRequest request HttpServletResponse res ...
- three.js 中使用多线程以及性能测试
今天郭先生说一下WebWorker以及WebWorker在three.js中的应用.我们都知道Javascript是单线程的,比如执行js代码的同时UI渲染就会停止,对于多核CPU的点脑,这一点让人难 ...
- js中对arry数组的各种操作小结 瀑布流AJAX无刷新加载数据列表--当页面滚动到Id时再继续加载数据 web前端url传递值 js加密解密 HTML中让表单input等文本框为只读不可编辑的方法 js监听用户的键盘敲击事件,兼容各大主流浏览器 HTML特殊字符
js中对arry数组的各种操作小结 最近工作比较轻松,于是就花时间从头到尾的对js进行了详细的学习和复习,在看书的过程中,发现自己平时在做项目的过程中有很多地方想得不过全面,写的不够合理,所以说啊 ...
- 在 node.js 的 express web 框架中自动注册路由
该方法主要是动态注册自己写的 router . 注册器 router 文件名为 loader.js . var express = require('express'); var fs = requ ...
随机推荐
- [知识图谱] 环境配置:Java8 + Maven3 + HBase + Titan
1.Java Java8安装配置 2.Maven Linux下的Maven安装与配置 3.Hbase 官方安装教程:http://s3.thinkaurelius.com/docs/titan/1.0 ...
- 关于HslCommunication组件的双模式客户端的说明,此说明适用于所有的派生类客户端,包括三菱,西门子,欧姆龙,modbustcp,机器人,simplifyNet客户端等等
前言 本文主要是答疑文章,针对广大网友非常频繁的提问而总结的问题 nuget地址:https://www.nuget.org/packages/HslCommunication/ ...
- IOS开发 多线程编程 - NSThread
每个iOS应用程序都有个专门用来更新显示UI界面.处理用户的触摸事件的主线程,因此不能将其他太耗时的操作放在主线程中执行,不然会造成主线程堵塞(出现卡机现象),带来极坏的用户体验.一般的解决方案就是将 ...
- IOS开发使用GCD后台运行
什么是GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法.该方法在Mac OS X 10.6雪豹中首次推出,并随后被引入到了iOS4.0中.GCD ...
- 使用vue与element组件
1.安装element npm i element-ui -S 2.引入 在main.js写入一下内容 import Vue from 'vue'; import ElementUI from 'el ...
- Cocos2d-X 3.2环境的配置
大三寒假时间特别长,终于准备坐下来好好去学一直想涉足的游戏开发.既然准备学,就要找个出色的.跨平台的引擎来实现自己的计划.最终我选定了Cocos2d-X. 在折腾了很久之后,我终于把Cocos2d-X ...
- Srping框架中使用@query注解实现复杂查询
[自己项目代码] @Query("select bean from User bean where bean.org.id=?1 and bean.group.id=?2") pu ...
- ubuntu 安装nodejs/npm
安装发行稳定版 Ubuntu 默认仓库里带有Node.js,版本较旧,这并不是最新版,但是应该很稳定.执行如下命令: 1 2 sudo apt-getupdate sudo apt-getinst ...
- BootStrap FileInput 插件实现多文件上传前端功能
<!DOCTYPE html> <html> <head> <title>文件上传</title> <meta charset=&qu ...
- L2-017. 人以群分
社交网络中我们给每个人定义了一个“活跃度”,现希望根据这个指标把人群分为两大类,即外向型(outgoing,即活跃度高的)和内向型(introverted,即活跃度低的).要求两类人群的规模尽可能接近 ...