未处理的拒绝TypeError:无法读取 null 的属性“2”

问题描述

我使用谷歌电子表格作为我的 React 应用程序的 CMS。我在 dotenv 文件中保存了来自谷歌开发者控制台的所需凭据。但是 REACT_APP_PRIVATE_KEY 导致了这个错误。 当我在 PRIVATE_KEY 函数中硬编码 handleSubmit 值时,该应用程序运行良好。 请帮助(PS,如果有人需要任何其他文件,请告诉我)

dotenv

REACT_APP_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----\n*********\n-----END PRIVATE KEY-----\n
REACT_APP_CLIENT_EMAIL=**********.gserviceaccount.com
REACT_APP_SHEET_ID=*********

handleSubmit 函数

const handleSubmit=async (e)=>{
        const doc =new GoogleSpreadsheet(process.env.REACT_APP_SHEET_ID);
        console.log(process.env.REACT_APP_PRIVATE_KEY)
        console.log(process.env.REACT_APP_CLIENT_EMAIL)
        await doc.useServiceAccountAuth({
            client_email:process.env.REACT_APP_CLIENT_EMAIL,private_key: process.env.REACT_APP_PRIVATE_KEY        
        });
      
      
        await doc.loadInfo(); 
        const sheet = doc.sheetsByIndex[0];
        await sheet.addRow({Website:website,Password:password})
        window.location.reload();
   }

这是错误控制台的屏幕截图:https://imgur.com/a/9OlgQ1X

编辑-1 parseKeys index.js

var asn1 = require('./asn1')
var aesid = require('./aesid.json')
var fixProc = require('./fixProc')
var ciphers = require('browserify-aes')
var compat = require('pbkdf2')
var Buffer = require('safe-buffer').Buffer
module.exports = parseKeys

function parseKeys (buffer) {
  var password
  if (typeof buffer === 'object' && !Buffer.isBuffer(buffer)) {
    password = buffer.passphrase
    buffer = buffer.key
  }
  if (typeof buffer === 'string') {
    buffer = Buffer.from(buffer)
  }

  var stripped = fixProc(buffer,password) ///<=line 19

  var type = stripped.tag
  var data = stripped.data
  var subtype,ndata
  switch (type) {
    case 'CERTIFICATE':
      ndata = asn1.certificate.decode(data,'der').tbsCertificate.subjectPublicKeyInfo
      // falls through
    case 'PUBLIC KEY':
      if (!ndata) {
        ndata = asn1.PublicKey.decode(data,'der')
      }
      subtype = ndata.algorithm.algorithm.join('.')
      switch (subtype) {
        case '1.2.840.113549.1.1.1':
          return asn1.RSAPublicKey.decode(ndata.subjectPublicKey.data,'der')
        case '1.2.840.10045.2.1':
          ndata.subjectPrivateKey = ndata.subjectPublicKey
          return {
            type: 'ec',data: ndata
          }
        case '1.2.840.10040.4.1':
          ndata.algorithm.params.pub_key = asn1.DSAparam.decode(ndata.subjectPublicKey.data,'der')
          return {
            type: 'dsa',data: ndata.algorithm.params
          }
        default: throw new Error('unkNown key id ' + subtype)
      }
      // throw new Error('unkNown key type ' + type)
    case 'ENCRYPTED PRIVATE KEY':
      data = asn1.EncryptedPrivateKey.decode(data,'der')
      data = decrypt(data,password)
      // falls through
    case 'PRIVATE KEY':
      ndata = asn1.PrivateKey.decode(data,'der')
      subtype = ndata.algorithm.algorithm.join('.')
      switch (subtype) {
        case '1.2.840.113549.1.1.1':
          return asn1.RSAPrivateKey.decode(ndata.subjectPrivateKey,'der')
        case '1.2.840.10045.2.1':
          return {
            curve: ndata.algorithm.curve,privateKey: asn1.ECPrivateKey.decode(ndata.subjectPrivateKey,'der').privateKey
          }
        case '1.2.840.10040.4.1':
          ndata.algorithm.params.priv_key = asn1.DSAparam.decode(ndata.subjectPrivateKey,params: ndata.algorithm.params
          }
        default: throw new Error('unkNown key id ' + subtype)
      }
      // throw new Error('unkNown key type ' + type)
    case 'RSA PUBLIC KEY':
      return asn1.RSAPublicKey.decode(data,'der')
    case 'RSA PRIVATE KEY':
      return asn1.RSAPrivateKey.decode(data,'der')
    case 'DSA PRIVATE KEY':
      return {
        type: 'dsa',params: asn1.DSAPrivateKey.decode(data,'der')
      }
    case 'EC PRIVATE KEY':
      data = asn1.ECPrivateKey.decode(data,'der')
      return {
        curve: data.parameters.value,privateKey: data.privateKey
      }
    default: throw new Error('unkNown key type ' + type)
  }
}
parseKeys.signature = asn1.signature
function decrypt (data,password) {
  var salt = data.algorithm.decrypt.kde.kdeparams.salt
  var iters = parseInt(data.algorithm.decrypt.kde.kdeparams.iters.toString(),10)
  var algo = aesid[data.algorithm.decrypt.cipher.algo.join('.')]
  var iv = data.algorithm.decrypt.cipher.iv
  var cipherText = data.subjectPrivateKey
  var keylen = parseInt(algo.split('-')[1],10) / 8
  var key = compat.pbkdf2Sync(password,salt,iters,keylen,'sha1')
  var cipher = ciphers.createDecipheriv(algo,key,iv)
  var out = []
  out.push(cipher.update(cipherText))
  out.push(cipher.final())
  return Buffer.concat(out)
}

编辑-2 fixproc.js

// adapted from https://github.com/apatil/pemstrip
var findProc = /Proc-Type: 4,ENCRYPTED[\n\r]+DEK-Info: AES-((?:128)|(?:192)|(?:256))-CBC,([0-9A-H]+)[\n\r]+([0-9A-z\n\r+/=]+)[\n\r]+/m
var startRegex = /^-----BEGIN ((?:.*? KEY)|CERTIFICATE)-----/m
var fullRegex = /^-----BEGIN ((?:.*? KEY)|CERTIFICATE)-----([0-9A-z\n\r+/=]+)-----END \1-----$/m
var evp = require('evp_bytestokey')
var ciphers = require('browserify-aes')
var Buffer = require('safe-buffer').Buffer
module.exports = function (okey,password) {
  var key = okey.toString()
  var match = key.match(findProc)
  var decrypted
  if (!match) {
    var match2 = key.match(fullRegex)
    decrypted = Buffer.from(match2[2].replace(/[\r\n]/g,''),'base64') //<=line14
  } else {
    var suite = 'aes' + match[1]
    var iv = Buffer.from(match[2],'hex')
    var cipherText = Buffer.from(match[3].replace(/[\r\n]/g,'base64')
    var cipherKey = evp(password,iv.slice(0,8),parseInt(match[1],10)).key
    var out = []
    var cipher = ciphers.createDecipheriv(suite,cipherKey,iv)
    out.push(cipher.update(cipherText))
    out.push(cipher.final())
    decrypted = Buffer.concat(out)
  }
  var tag = key.match(startRegex)[1]
  return {
    tag: tag,data: decrypted
  }
}

解决方法

尝试将您的私钥散列到 base64 字符串中,然后将散列值放入 env 文件中,并在使用时对其进行解码。这是存储私钥的更安全方式