发布网友 发布时间:2022-04-22 09:37
共1个回答
热心网友 时间:2023-09-23 14:01
crypto API支持常用的rsa、aes加解密,这边介绍rsa的应用。
window.crypto需要chrome 37版本,ie 11,safari 11才支持全部API而基本的加解密在safari 7就可以。
crypto.subtle.generateKey(algorithm, extractable, keyUsages),其中:
1.algorithm参数根据不同算法填入对应的参数对,rsa需要填入RsaHashedKeyGenParams对象包含有:
2.extractable一般是true,表示是否允许以文本的方式导出key
3.keyUsages是一个数组,里面可选encrypt,decrypt,sign等
函数结果返回一个promise对象,如果是对称加密会得到一个密钥CryptoKey类型,这边rsa会得到一个密钥对CryptoKeyPair,它有2个CryptoKey成员,privateKey和publicKey,我们导出密钥为文本或者加解密都将通过这2个成员对象。
window.crypto.subtle.exportKey(format, key),其中:
1.format可选raw,pkcs8,spki,jwk,我们这边在导出公钥时选spki,私钥选pkcs8
2.key就是上面CryptoKeyPair的privateKey或者publicKey
函数返回一个promise对象,结果是一个ArrayBuffer,这边转成pem风格。
window.crypto.subtle.importKey(
format,
keyData,
algorithm,
extractable,
keyUsages
),其中:
1.format可选raw,pkcs8,spki,jwk,对应之前生成时的选择,我们这边在导入公钥时选spki,私钥选pkcs8。
2.keyData,即window.crypto.subtle.exportKey获得的ArrayBuffer,由于在这里时我们一般只有pem文本的,所以还需要做转换成ArrayBuffer。
3.algorithm这边我们是rsa,需要填入一个RsaHashedImportParams对象,这边对应crypto.subtle.generateKey所需的RsaHashedKeyGenParams对象,含有:
4.extractable同crypto.subtle.generateKey的
5.keyUsages同crypto.subtle.generateKey
函数返回一个promise对象,结果是一个CryptoKey。
加密crypto.subtle.encrypt(algorithm, key, data),其中:
1.algorithm,加解密只支持RSA-OAEP不支持RSAES-PKCS1-v1_5
2.key即公钥的CryptoKey对象
3.data是一个BufferSource对象,不能直接是要加密的字符串。
结果是一个ArrayBuffer,可以使用window.btoa(String.fromCharCode(...new Uint8Array(e)))输出为base字符串
解密crypto.subtle.decrypt(algorithm, key, data),基本同加密,这边data对应为加密返回的ArrayBuffer,如果是base字符串比如从后端加密过来的,就需要转为Uint8Array。
返回值同加密