Javascript 不安全源代码(Heroku应用程序)渲染NodeJS';s Web加密API要求()未定义。有什么解决办法吗?

Javascript 不安全源代码(Heroku应用程序)渲染NodeJS';s Web加密API要求()未定义。有什么解决办法吗?,javascript,node.js,mongodb,heroku,webcrypto-api,Javascript,Node.js,Mongodb,Heroku,Webcrypto Api,我正试图在我的Herokuapp Nodejs服务器上实现实验性的Web加密api(SublecryPto),以便对gitpages->Herokuapp fetch请求中的数据进行加密,从浏览器控制台网络选项卡中隐藏其中的敏感信息,然后解密客户端 以下是我的参考资料 不幸的是,我试图从SubTecryPto调用的任何方法都会返回为未定义的、喷出错误,例如 TypeError: Cannot read property 'encrypt' of undefined 当我试着跑的时候 const

我正试图在我的Herokuapp Nodejs服务器上实现实验性的Web加密api(SublecryPto),以便对gitpages->Herokuapp fetch请求中的数据进行加密,从浏览器控制台网络选项卡中隐藏其中的敏感信息,然后解密客户端

以下是我的参考资料

不幸的是,我试图从SubTecryPto调用的任何方法都会返回为未定义的、喷出错误,例如

TypeError: Cannot read property 'encrypt' of undefined
当我试着跑的时候

const cipher = await SubtleCrypto.encrypt({ name: 'AES-CBC', iv }, ckey, ec.encode('data'));

当我试图定义

const iv = getRandomValues(new Uint8Array(16));
该线程似乎指出了问题所在(chromium认为origin是不安全的,禁止使用SublecryPto),但未能为我自己的环境提供解决方案

这是我的管道: 在github页面(启用强制HTTPS)中,此.js文件链接在html页面中,向我的Heroku应用程序发送获取请求

var-apikey、dir、documentdir;
函数makeid(长度){
var结果=“”;
变量字符='ABCDEFGHIJKLMNOPQRSTUVXYZABCDFGHIJKLMNOPQRSTUVXYZ0123456789';
var charactersLength=characters.length;
for(var i=0;iresponse.json())
。然后((数据)=>{
window.crypto.division.importKey(
“raw”,//可以是“jwk”或“raw”
{//这是一个示例jwk键,“raw”将是一个ArrayBuffer
kty:“十月”,
k:标签,
alg:“A256CBC”,
分机:是的,
},
{//这是算法选项
名称:“AES-CBC”,
},
false,//密钥是否可提取(即可在exportKey中使用)
[“encrypt”、“decrypt”]//可以是“encrypt”、“decrypt”、“wrapKey”或“unwrapKey”
)
.然后(功能(键){
window.crypto.division.decrypt(
{
名称:“AES-CBC”,
iv:data.vi,//用于加密的初始化向量
},
键,//来自上面的generateKey或importKey
data.iv//数据的数组缓冲区
)
.then(函数(已解密){
//返回包含解密数据的ArrayBuffer
log(新的Uint8Array(已解密));
apikey=data.api;
doccy=data.docname;
dir=data.dir;
})
})
.catch(函数(err){
控制台错误(err);
});
})
.然后(函数(){
var adobeDCView=newadobedc.View({clientId:apikey,divId:“AdobeDC视图”});
adobecview.previewFile({
内容:{location:{url:dir}},
元数据:{fileName:doccy}
},{embedMode:“IN_LINE”,showDownloadPDF:false,showPrintPDF:false});
});
});
当应用程序检测到对api/NotTheActualLink的请求时,它会读取我发送给它的自定义头,以获取生成加密密钥(ckey)的随机字符串和我希望它响应的文档ID(ID)

const express=require(“express”);
常量app=express();
const sublecrypto=需要(“加密”).webcrypto;
const{MongoClient}=require(“mongodb”);
const uri=process.env.MONGODB_uri;
const origin=process.env.origin\u URL;
const db=process.env.db_NAME;
const col=process.env.col_NAME;
const path=process.env.API_path;
const xheader1=process.env.X_头文件_1;
const xheader2=process.env.X_头2;
应用程序选项(路径、异步函数(请求、恢复、下一步){
res.header(“访问控制-允许-来源”,来源);
res.header('Access-Control-Allow-Methods','GET,OPTIONS');
res.header('Access-Control-Allow-Headers',xheader1.concat(“,”,xheader2));
next();
});
app.get(路径,异步函数(req,res){
const client=new MongoClient(uri,{useUnifiedTopology:true});
res.header(“访问控制-允许-来源”,来源);
res.header('Access-Control-Allow-Methods','GET,OPTIONS');
res.header('Access-Control-Allow-Headers',xheader1.concat(“,”,xheader2));
试一试{
等待client.connect();
console.log(“issecurencontext=“+app.issecurencontext”);
var ckey=请求标头(xheader1);
变量id=请求标头(xheader2);
console.log(“key=“+ckey”);
console.log(“id=”+id);
const database=client.db(db);
const collection=database.collection(col);
const query={docId:id};
const cursor=wait collection.findOne(查询);
常量结果=光标;
const ec=新的TextEncoder();
常量算法='aes-256-cbc';
const iv=getRandomValues(新的Uint8Array(16));
const cipher=await sublecrypto.encrypt({name:'AES-CBC',iv},ckey,ec.encode(result));
const data=await subtelcrypto.encrypt({name:'AES-CBC',iv},ckey,cipher);
var响应=
{
iv:iv.toString('hex'),
日期:data.toString('hex')
};
返回res.json(响应);
}捕捉(错误){
控制台日志(err);
}
最后{
等待客户端。关闭();
}
});
应用程序侦听(process.env.PORT | | 3000,
()=>console.log(“服务器正在运行…”);
从那里它建立到我的MongoDB集群的连接(链接:MongoDB)+srv://yada:yadayada@foo.bar.mongodb.net/mydatabase?retryWrites=true&w=mailty),检索包含我要加密的数据的文档,并发送到客户端浏览器。或者至少这是它应该做的

我只是不明白他们中的哪一个
const iv = getRandomValues(new Uint8Array(16));