当前位置: 首页 > 知识库问答 >
问题:

XML到节点中的PEM。js公司

郭俊拔
2023-03-14

我一直使用加密api,因为我对密码学知之甚少。我有这个

XML:
<RSAKeyValue>
    <Modulus>1znidPBIcMcO7K/53tkTSyKqxlG5Mcws8kVtijS4tyEU4W/FEVWYpOtv+Stnb4Vt</Modulus>
    <Exponent>AQAB</Exponent>
</RSAKeyValue>

Signature:
rNbdUP-p4pEGfwQSwR6VPvAVZ-sZu-ptgw8SofYYmNTlfUB9iUbb593eCAuT5jsqDTC

Original data:
<xml>...some big xml...</xml>

我想验证签名,我该怎么做?

(我正在使用节点v0.10.18)

共有1个答案

百里渊
2023-03-14

我不是一个真正的节点。js dev,这是超级黑客。。这里有一个函数,它应该从Base64模和指数输出RSA公钥PEM。我是根据Trevor对node的评论来做的。js验证需要PEM。

此函数构成ASN。以十六进制对结构进行排序,然后十六进制对其进行解码,然后base64对其进行编码,然后将其夹在开始私钥和结束私钥之间。毕竟,这就是PEM的全部。

function rsaPublicKeyPem(modulus_b64, exponent_b64) {

    function prepadSigned(hexStr) {
        msb = hexStr[0]
        if (
            (msb>='8' && msb<='9') || 
            (msb>='a' && msb<='f') || 
            (msb>='A'&&msb<='F')) {
            return '00'+hexStr;
        } else {
            return hexStr;
        }
    }

    function toHex(number) {
        var nstr = number.toString(16)
        if (nstr.length%2==0) return nstr
        return '0'+nstr
    }

    // encode ASN.1 DER length field
    // if <=127, short form
    // if >=128, long form
    function encodeLengthHex(n) {
        if (n<=127) return toHex(n)
        else {
            n_hex = toHex(n)
            length_of_length_byte = 128 + n_hex.length/2 // 0x80+numbytes
            return toHex(length_of_length_byte)+n_hex
        }
    }

    var modulus = new Buffer(modulus_b64,'base64');
    var exponent = new Buffer(exponent_b64, 'base64');

    var modulus_hex = modulus.toString('hex')
    var exponent_hex = exponent.toString('hex')

    modulus_hex = prepadSigned(modulus_hex)
    exponent_hex = prepadSigned(exponent_hex)

    var modlen = modulus_hex.length/2
    var explen = exponent_hex.length/2

    var encoded_modlen = encodeLengthHex(modlen)
    var encoded_explen = encodeLengthHex(explen)
    var encoded_pubkey = '30' + 
        encodeLengthHex(
            modlen + 
            explen + 
            encoded_modlen.length/2 + 
            encoded_explen.length/2 + 2
        ) + 
        '02' + encoded_modlen + modulus_hex +
        '02' + encoded_explen + exponent_hex;

    var seq2 = 
        '30 0d ' +
          '06 09 2a 86 48 86 f7 0d 01 01 01' +
          '05 00 ' +
        '03' + encodeLengthHex(encoded_pubkey.length/2 + 1) +
        '00' + encoded_pubkey;

    seq2 = seq2.replace(/ /g,'');

    var der_hex = '30' + encodeLengthHex(seq2.length/2) + seq2;

    der_hex = der_hex.replace(/ /g, '');

    var der = new Buffer(der_hex, 'hex');
    var der_b64 = der.toString('base64');

    var pem = '-----BEGIN PUBLIC KEY-----\n' 
        + der_b64.match(/.{1,64}/g).join('\n') 
        + '\n-----END PUBLIC KEY-----\n';

    return pem
}

用十六进制字符串进行二进制操作?恶心...但是这是一个黑客。

 类似资料:
  • 我获得了苹果推送服务的以下代码: 当我在localhost上运行服务器时,我输入pem键,服务器开始工作。 我如何将它设置为自动输入,因为我将它部署在heroku上,我会推heroku master,服务器会因为我没有输入pem密钥而失败。

  • 问题内容: 我对crypto api感到困惑,因为我对密码学了解甚少。我有这个 我要验证签名,该怎么做? (我正在使用节点v0.10.18) 问题答案: 我不是一个真正的node.js开发人员,所以这很hack ..这是一个应从Base64模数和指数输出RSA公钥PEM的函数。我将基于Trevor关于node.js 期望PEM 的评论。 此函数以十六进制组成ASN.1 DER结构,然后对其进行十六

  • 我不知道如何通过N连接到AWS的ElastiCache Redisode.js.我已经成功地通过node_redisNPM连接到主主机(001),但是我无法使用ioredis的集群能力,因为显然ElastiCache没有实现CLUSTER命令。 我认为必须有另一种方法,但用于节点的AWS SDK只有用于管理ElastiCache的命令,而不是用于实际连接到ElastiCache的命令。 如果不使用

  • 问题内容: 我碰到了这段Java函数,将XML节点转换为Java String表示形式: 它看起来很简单,因为它希望输出字符串没有任何XML声明,并且必须包含缩进。 但是我想知道实际的输出应该如何,假设我有一个XML节点: 我可以假设应用上述转换后得到的String是: 我想自己测试一下,但是我不知道如何以该函数实际需要的方式表示这个XML节点。 我有些困惑,在此先感谢您的慷慨帮助。 问题答案:

  • 我正在尝试使用Node fetch下载一个typescript(Node.js)文件。 根据文档和此处的堆栈溢出答案,以下代码应该可以工作: 但我得到以下错误: 我还检查了类型文件中节点获取类型的响应。它没有管道功能。 我在这里检查了节点获取的类型定义,根据这里的接口,响应的主体似乎是一个可读的流: } 并有一个函数pipeTo(我从这里的留档中找到了这个。我在浏览了提到的留档后尝试运行以下代码:

  • 我正在尝试使用Node验证Patreon的webhook签名。js。这是我的代码: Patreon webhooks使用MD5-请参阅https://docs.patreon.com/#webhooks. 我已经多次验证了密钥,所以我知道这不是问题。 “request.header(“x-patreon-signature”)”和“hash”都返回了正确的格式(即它们都是32位字母数字的组合),但