当前位置: 首页 > 面试题库 >

XML到Node.js中的PEM

李华茂
2023-03-14
问题内容

我对crypto 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)


问题答案:

我不是一个真正的node.js开发人员,所以这很hack
..这是一个应从Base64模数和指数输出RSA公钥PEM的函数。我将基于Trevor关于node.js verify期望PEM 的评论。

此函数以十六进制组成ASN.1 DER结构,然后对其进行十六进制解码,然后对其进行base64编码,然后将其夹在-----BEGIN PRIVATE KEY-----和之间-----END PRIVATE KEY-----。毕竟,这就是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
}

用十六进制字符串进行二进制操作?uck ..但是嘿,这是一个hack。



 类似资料:
  • 问题内容: 我已经安装了node- xml,但是我认为它没有按我期望的方式工作。它没有例子。对node.js的xml-2-json(js)有什么建议吗?我还在npm中查看了xml2js,但已不推荐使用它,人们报告说它已被最新的node.js破坏了。 顺便说一句,我也使用快递。:) 问题答案: 有很多xml解析器。 像libxmljs和node-o3-xml一样。后者是由Ajax.org制作和使用的

  • 这是我想做的, 这是我的spend.csv文件: 从表视图: csv的表格视图 这是我想要的输出文件,名为spend.xml: 为了做到这一点,我在这里和那里找到了一些东西,并设法得到了这个: 此时,程序应该在终端中打印XML文件,但是; 遗憾的是,由于我的CSV文件中每个值都有双引号,我遇到了这个问题: java组织。w3c。多姆。DOMEException invalid_character_

  • 我一直使用加密api,因为我对密码学知之甚少。我有这个 我想验证签名,我该怎么做? (我正在使用节点v0.10.18)

  • 问题内容: 我试图使用。通过Node.js向Web服务提交xml请求。 这是我的代码。我的问题是,而不是我想将xml发布到服务。 何去做? 问题答案: 返回ClientRequest对象,该对象也是可写流。代替做或

  • 问题内容: 我正在努力使自己在Node.js中实现同步与异步,尤其是在读取html文件时。 在请求处理程序中,可以使用的同步版本如下: 使用readFile()的版本是什么? 我了解readFile是异步的,因此从理论上讲,我应该等待整个文件读取后再呈现,因此我应该引入addListener吗?我可能会混淆其他事情。 编辑:我试图重构这样的代码: 我得到一个空白页,我想这是因为它应该等待所有数据已

  • 我正在尝试创建包含另一个XML的XML文档,比如child。 首先,我有一个对象Foo,它有一些属性。我用这个函数序列化它: 在另一个我无法访问Foo类的类中,我需要用这个Foo字符串在xml文档中保存一些数据。所以我有另一个像这样的物体: 当我序列化这个Bar对象并像xml文档一样保存它时。对于FooString元素,我得到了类似的结果。 我明白这个超文本标记语言字符实体(