节点- jose aws- kms- 扩展
这个库是扩展 节点夹 库,并使用猴子相扑来扩展节点-jose的能力. 它为基于JWE的加密器/解密器和基于JWS的签名器/验证器提供加密操作,并存储在AWS密钥管理服务(KMS)中.
安装
您可以从 无 使用下列命令。 这个图书馆需要18个或以上的Node.js.
npm install @aws-crypto/node-jose_aws-kms-extension
使用量
从 @aws-crypto/node-jose_aws-kms-extension 模块 :
import {
KMSAsymmetricSigningKey,
KMSSymmetricCEK,
KMSSymmetricKey,
} from '@aws-crypto/node-jose_aws-kms-extension';
导入主jose 对象 .
import { jose } from '@aws-crypto/node-jose_aws-kms-extension';
现在,你可以使用所有现有的节点-快感特性, 和没有这个库时一样。 这个库透明地增加了 AWS KMS 支持 。 您可以使用您的 AWS KMS 密钥进行各种加密和签名操作, 使用常规节点- jose 函数 。 AWS KMS 特定的算法名称被支持.
支助 node-jose 职能包括:
jose.JWE.createEncrypt()jose.JWE.createDecrypt()jose.JWS.createSign()jose.JWS.createVerify()
此库使用 @aws- sdk/ 客户端 - kms 它与AWS KMS的所有通讯.
实例
从模块@aws-crypto/node-jose aws-kms-extension和@aws-sdk/客户端-kms导入变量
import {
jose,
KMSAsymmetricSigningKey,
KMSSymmetricCEK,
KMSSymmetricKey,
} from '@aws-crypto/node-jose_aws-kms-extension';
import { KMSClient } from "@aws-sdk/client-kms";
创建 AWS KMS 客户端
const kmsClient: KMSClient = new KMSClient({ region: 'REGION' });
签名
- 准备格式为
compact,以及标题字段. - 将密钥与 KMSA 对称标记关键对象一起编写签名 .
- 用乔斯 JWS. 创建签名方法 签署有效载荷.
const signingOpts = {
format: 'compact',
fields: {
alg: 'SIGNING_ALGORITHM',
kid: 'KMS_SIGNING_KEY_ID',
JWS_CRIT_HEADER1: 'JWS_CRIT_HEADER1_VALUE',
JWS_CRIT_HEADER2: 'JWS_CRIT_HEADER2_VALUE',
crit: ['JWS_CRIT_HEADER1', 'JWS_CRIT_HEADER2'],
},
};
const signatory = {
key: new KMSAsymmetricSigningKey('KMS_SIGNING_KEY_ID', kmsClient),
};
const dataToSign = 'This is the data to sign';
const signer = jose.JWS.createSign(signingOpts, signatory);
const jws: Promise<string> = signer
.update(dataToSign)
.final()
.then(function (result: string) {
console.log('JWS: ', result);
return result;
});
加密
- 编写格式为
compact,标题字段和 cek 作为 KMSS对称CEK 对象. - 将加密收件人编制为
false键。 使用相同的 KMS 密钥创建 KMSS对称CEK 和 KMSS对称Key . - 使用乔斯。 JWE.创建加密jws有效载荷的方法.
const encryptionOpts = {
format: 'compact',
fields: {
kid: 'ENCRYPTION_KMS_KEY_ID',
alg: 'KEY_ENCRYPTION_ALGORITHM',
enc: 'CONTENT_ENCRYPTION_ALGORITHM',
JWE_CRIT_HEADER1: 'JWE_CRIT_HEADER1_VALUE',
JWE_CRIT_HEADER2: 'JWE_CRIT_HEADER2_VALUE',
crit: ['JWE_CRIT_HEADER1', 'JWE_CRIT_HEADER2'],
},
cek: new KMSSymmetricCEK('KMS_ENCRYPTION_KEY_ID', kmsClient, 'KEY_SPEC'),
};
const encryptionRecipient = {
reference: false,
key: new KMSSymmetricKey('KMS_ENCRYPTION_KEY_ID', kmsClient),
};
const encrypter = jose.JWE.createEncrypt(
encryptionOpts,
encryptionRecipient,
);
const jwe: Promise<string> = jws.then(function (jws: string) {
return encrypter
.update(jws)
.final()
.then(function (result: string) {
console.log('JWE: ', result);
return result;
});
});
解密
- 与处理器一起准备解密选项来处理jwe关键头.
- 预解密被假定为 KMSS 对称Key 对象
- 用乔斯 JWE.创建解密jwe有效载荷的方法.
const decryption_opts = {
handlers: {
JWE_CRIT_HEADER1: function(jwe: any) {
console.log(jwe.header.JWE_CRIT_HEADER1)
// process JWE_CRIT_HEADER1
},
JWE_CRIT_HEADER2: function(jwe: any) {
console.log(jwe.header.JWE_CRIT_HEADER2)
// process JWE_CRIT_HEADER2
}
},
};
const decryption_assumedKey = new KMSSymmetricKey(
'KMS_ENCRYPTION_KEY_ID',
kmsClient,
);
const decrypter = jose.JWE.createDecrypt(
decryption_assumedKey,
decryption_opts,
);
const decyptedContent: Promise<any> = jwe.then(function (jwe: string) {
return decrypter.decrypt(jwe).then(function (result: any) {
console.log('JWE decryption result: ', result);
return result;
});
});
核查
- 与处理器一起编写验证选项,处理jws关键头.
- 准备假想的 KMSA 对称签名关键对象的校验
- 用乔斯 JWS.创建验证jws有效载荷的方法.
const verification_opts = {
handlers: {
JWS_CRIT_HEADER1: function(jws: any) {
console.log(jws.header.JWS_CRIT_HEADER1)
// process JWS_CRIT_HEADER1
},
JWS_CRIT_HEADER2: function(jws: any) {
console.log(jws.header.JWS_CRIT_HEADER2)
// process JWS_CRIT_HEADER2
}
},
};
const verificationAssumedKey = new KMSAsymmetricSigningKey(
'KMS_SIGNING_KEY_ID',
kmsClient,
);
const verifier = jose.JWS.createVerify(
verificationAssumedKey,
verification_opts,
);
const verificationResult: Promise<any> = decyptedContent.then(function (
decryptedContent: any,
) {
const payloadToVerify = jose.util.utf8.encode(decryptedContent.payload);
return verifier.verify(payloadToVerify).then(function (result: any) {
console.log('JWS verification result: ', result);
console.log('Verified payload: ', jose.util.utf8.encode(result.payload));
return result;
});
});
注:KMS SIGNING KEY ID和KMS ENCRYPTION KEY ID可以是KMS密钥ID,密钥ARN,别名,或别名ARN. 当使用别名时, 它会有前缀 alias/。应在不同的亚马逊网络服务账户中指定关键ARN或别名ARN.
警卫
见 捐款 更多信息.
许可证
该图书馆在以下 Apache 许可证,2.0版本, (中文(简体) ), 见 自由主义 财务报告和审定财务报表 通知 更多信息.