Skip to content

SubtleCryptoWeb 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
}