未捕获的URIError:使用jQuery的URI格式错误

时间:2017-08-21 11:56:06

标签: javascript jquery node.js encryption

我使用node forge加密表单,然后使用AES将表单发送到服务器。

现在加密部分的代码是

const bigInt = require("big-integer");
const forge = require('node-forge');

function generateParams() {
    // Cryptographic random number generator
    var array = new Uint32Array(2);
    var _key = bigInt(window.crypto.getRandomValues(array)[0]).toString();
    var _iv = bigInt(window.crypto.getRandomValues(array)[1]).toString();
    // generate random key and IV 
    var key = forge.util.encode64(_key);
    var iv = forge.util.encode64(_iv);
    const params = {
        key: key,
        iv: iv
    }
    return params;
}

function encrypt(params) {
    var cipher = forge.rc2.createEncryptionCipher(params.key);
    cipher.start(params.iv);
    // Encrypting "testing"
    cipher.update(forge.util.createBuffer("testing"));
    cipher.finish();
    return cipher.output;
}

function decrypt(params, encrypted) {
    var cipher = forge.rc2.createDecryptionCipher(params.key);
    cipher.start(params.iv);
    cipher.update(encrypted);
    cipher.finish();
    return cipher.output;
}

和jQuery函数(尚未发布)

$('#recordForm').submit(function(event) {
    // Stop form from submitting normally
    event.preventDefault();
    // Grab form data
    // Crypto
    const params = generateParams();
    const encryptedForm = {
        test: encrypt(params),
    }
    console.log("Encrypted: " + encryptedForm.test);
    const decryptedForm = {
        test: decrypt(params, encryptedForm.id).data,
    }
    console.log("Decrypted: " + decryptedForm.test);
});

我的问题是我一直回来(cryptob.js是我的文件名,用browserify生成)

Uncaught URIError: URI malformed
    at decodeURIComponent (<anonymous>)
    at Object.util.decodeUtf8 (cryptob.js:24437)
    at ByteStringBuffer.util.ByteStringBuffer.toString (cryptob.js:23490)
    at HTMLFormElement.<anonymous> (cryptob.js:1282)
    at HTMLFormElement.dispatch (jquery-3.1.1.slim.min.js:3)
    at HTMLFormElement.q.handle (jquery-3.1.1.slim.min.js:3)

致电encrypt()

这里有this个答案,建议包含一个特殊的元标记。我已经这样做但它仍然无效。由于网上的一些资源说它与UTF-8编码有关,我试图替换

cipher.update(forge.util.createBuffer("testing"));

cipher.update(forge.util.createBuffer(encodeURIComponent("testing")));

cipher.update(forge.util.createBuffer("testing", 'utf8'));

但它也不起作用(基于encodeURIComponent(str))。

您可以测试伪造here,如果您运行此代码(这基本上就是我正在做的)

var forge = require("node-forge")

// generate a random key and IV 
var key = forge.util.encode64("12354523465");
var iv = forge.util.encode64("2315");

// encrypt some bytes 
var cipher = forge.rc2.createEncryptionCipher(key);
cipher.start(iv);
cipher.update(forge.util.createBuffer("testing"));
cipher.finish();
var encrypted = cipher.output; 
console.log(encrypted);

// decrypt some bytes 
var cipher = forge.rc2.createDecryptionCipher(key);
cipher.start(iv);
cipher.update(encrypted);
cipher.finish();
console.log(cipher.output.data)

它工作正常。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

看起来这个错误实际上发生在toString中,你生成_key和_iv。

尝试使用一些硬编码字符串进行测试,如您发布的示例代码中所使用的那样。然后,使用一种方法为密钥和IV生成随机字节字符串。

此外,对于AES-256,密钥应具有32个字节(而不是位)的熵。 IV应该有16个字节的熵。