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)))輸出為base64字符串
解密 crypto.subtle.decrypt(algorithm, key, data) ,基本同加密,這邊data對應為加密返回的ArrayBuffer,如果是base64字符串比如從後端加密過來的,就需要轉為Uint8Array。
返回值同加密