crypto.web.js/src/crypto.js

120 lines
2.4 KiB
JavaScript

import { str2uint, getType } from './helper.js'
const subtle = window.crypto.subtle
var __stamp__ = 0
var __inc__ = 0 //用于生成保证唯一的uuid种子
// 将其他数据类型转为uint8
function any2uint(data) {
let val = data ?? ''
let type = getType(val)
switch (type) {
case 'Uint8Array':
break
case 'ArrayBuffer':
val = new Uint8Array(val)
break
case 'Number':
case 'String':
case 'Boolean':
val = str2uint(val)
break
default:
val = val.toString()
break
}
return val
}
export function uuid(pipe = '-') {
var rand = Math.random().toString(16).slice(2) + Math.random().toString(16).slice(2)
var now = (~~(Date.now() / 1000)).toString(16)
if (__stamp__ === now) {
__inc__++
} else {
__stamp__ = now
__inc__ = 0
}
rand = __inc__.toString(16) + rand
return __stamp__ + pipe + rand.slice(0, 4) + pipe + rand.slice(4, 8) + pipe + rand.slice(-8)
}
/**
* ArrayBuffer 转 hex
*/
export function ab2hex(buf) {
var uint8 = new Uint8Array(buf)
return [...uint8].map(n => n.toString(16).padStart(2, '0')).join('')
}
/**
* ArrayBuffer 转 Binary
*/
export function ab2bin(buf) {
var bin = ''
var uint8 = new Uint8Array(buf)
for (var i = 0; i < uint8.length; i++) {
bin += String.fromCharCode(uint8[i])
}
return bin
}
/* ------------------------------------- */
/**
* @return Promise
*/
export function hash(type, data) {
return subtle.digest(type, any2uint(data)).then(buf => ab2hex(buf))
}
export function sha1(str) {
return hash('SHA-1', str)
}
export function sha256(str) {
return hash('SHA-256', str)
}
export function sha512(str) {
return hash('SHA-512', str)
}
export function hmac(mode, data = '', key = '', encode) {
if (key) {
if (typeof key === 'string') {
key = str2uint(key)
}
} else {
key = new Uint8Array(16)
}
return subtle
.importKey('raw', key, { name: 'HMAC', hash: { name: mode } }, true, ['sign', 'verify'])
.then(cKey => subtle.sign('HMAC', cKey, any2uint(data)))
.then(ab => {
var output = ab
switch (encode) {
case 'binary':
output = ab2bin(ab)
break
case 'hex':
output = ab2hex(ab)
break
case 'base64':
output = window.btoa(ab2bin(ab))
break
case 'buffer':
output = new Uint8Array(ab)
break
}
return output
})
}
浏览器端的加密库
JavaScript 100%