如何通过ReactJS脚本中的WebCrypto“ importKey”导入Base64 PublicKey?

时间:2019-05-25 17:06:24

标签: javascript reactjs webcryptoapi ecdh

我正在尝试使用Web Crypto API函数importKey导入Base64 PublicKey。目的是创建一个简单的模式来解析PublicKey并启用密码加密。

我尝试使用importKey函数的“原始”方法将PublicKey作为Uint8Array导入-参见以下脚本:

import buffer from 'buffer'

let kpub = "U6uvqoxXGj17tFS5C05tSWohDQl2u1ugiHyNKXB9WF0UiYaxa5FxiLX/LxGeDUPMyLmWBGBUjpTzh1owF9RWug=="
let buff = new Buffer(kpub, 'base64');  

window.crypto.subtle.importKey(
  "raw",  
  buff,
  {    
      name: "ECDH",
      namedCurve: "P-256", 
  },
  false,  
  []  
)
.then(function(publicKey){
  console.log(publicKey);
})
.catch(function(err){
  console.error(err);
});

我希望这会产生输入的输入版本kpub。但是,输出未在控制台中显示-启用错误处理后,我得到了DOMException。

知道我做错了什么吗?

作为替代方案,将publicKey转换为JWK格式可能会更容易。例如,我已经确认下面的JWK可以在importKey函数中正常工作。但是,如果要使用此功能,我将很难将输入的kpub转换为x和y坐标:

const jwkKey = {
  "kty":"EC",
  "crv":"P-256",
  "x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU",
  "y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0",
  "kid":"Id that can be uniquely Identified"
}

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

在德米特里·切斯特尼克(Dmitry Chestnykh)的帮助下,我通过在单个字节前面添加0x04使其起作用:

const device_kpub_base64 = "U6uvqoxXGj17tFS5C05tSWohDQl2u1ugiHyNKXB9WF0UiYaxa5FxiLX/LxGeDUPMyLmWBGBUjpTzh1owF9RWug=="
const prepend_byte = new Buffer([4])
let device_kpub_buffer = new Buffer(device_kpub_base64, 'base64');  
device_kpub_buffer = Buffer.concat([prepend_byte, device_kpub_buffer])

// Import the device public key into the web crypto API
window.crypto.subtle.importKey(
  "raw",  
  device_kpub_buffer,
  {    
      name: "ECDH",
      namedCurve: "P-256", 
  },
  true,  
  []  
)
.then(function(devicePublicKey){
  console.log(devicePublicKey);
})
.catch(function(err){
  console.error(err);
});