SubtleCrypto
是 Web Crypto API
中的一个接口,它提供了用于执行加密、解密、签名、验证、摘要生成、密钥生成和密钥导入导出等操作的方法。
这个接口设计用于执行那些可能需要较长时间才能完成的加密操作,因此大多数方法都是异步的,返回一个 Promise
对象。
js
const crypto = require('node:crypto')
console.log(crypto.subtle)
1.digest
digest
信息摘要,计算数据的哈希值。
js
const crypto = require('node:crypto')
async function hashData(data) {
const encoder = new TextEncoder()
const dataArray = encoder.encode(data)
const hashBuffer = await crypto.subtle.digest('SHA-256', dataArray)
const hashArray = Array.from(new Uint8Array(hashBuffer))
const hashHex = hashArray.map(byte => byte.toString(16).padStart(2, '0')).join('')
return hashHex
}
hashData('Hello, world!').then(console.log)
2.generateKey
生成一个加密密钥或密钥对。
js
const crypto = require('node:crypto')
async function generateKeyPair() {
const keyPair = await crypto.subtle.generateKey(
{
name: 'RSA-PSS',
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: 'SHA-256'
},
true,
['sign', 'verify']
)
return keyPair
}
generateKeyPair().then(keyPair => {
console.log(keyPair)
})
3.encrypt&decrypt
js
/*
使用指定的算法和密钥对数据进行加密。
*/
const crypto = require('node:crypto')
async function encryptData(key, data) {
const encoder = new TextEncoder()
const dataArray = encoder.encode(data)
const iv = crypto.getRandomValues(new Uint8Array(12))
const encryptedData = await crypto.subtle.encrypt(
{
name: 'AES-GCM',
iv: iv
},
key,
dataArray
)
return { iv, encryptedData }
}
/*
使用指定的算法和密钥对数据进行解密。
*/
async function decryptData(key, iv, encryptedData) {
const decryptedData = await crypto.subtle.decrypt(
{
name: 'AES-GCM',
iv: iv
},
key,
encryptedData
)
const decoder = new TextDecoder()
return decoder.decode(decryptedData)
}
4.sign&verify
js
/*
生成签名,用于数据的完整性和真实性验证。
*/
const crypto = require('node:crypto')
async function signData(key, data) {
const encoder = new TextEncoder()
const dataArray = encoder.encode(data)
const signature = await crypto.subtle.sign(
{
name: 'RSA-PSS',
saltLength: 32,
},
key,
dataArray
)
return signature
}
/*
验证签名,确保数据的完整性和真实性。
*/
async function verifySignature(key, data, signature) {
const encoder = new TextEncoder()
const dataArray = encoder.encode(data)
const isValid = await crypto.subtle.verify(
{
name: 'RSA-PSS',
saltLength: 32,
},
key,
signature,
dataArray
)
return isValid
}