JS:存储在数据库(SJCL)后无法解密

时间:2015-05-24 16:31:03

标签: javascript ajax encryption sjcl

我正在试验Stanford Javascript Crypto Library (SJCL)并希望加密并稍后解密字符串。

以下代码可以正常使用:

var pw = "password";
var message = "message";
var encrypted = sjcl.encrypt(pw, message);
alert(encrypted);

var decrypted = sjcl.decrypt(pw, encrypted)
alert(decrypted);

第一个警报显示加密数据,第二个警报显示"消息"。但是我需要将var加密存储在SQL数据库中,因此我将它通过ajax发送到服务器,然后将其存储在表中。

我后来请求加密的消息(再次通过ajax)并将其存储在加密的变量中。之后我想解密它:

var decrypted = sjcl.decrypt(pw, encrypted);
alert(decrypted);

但我没有收到包含字符串"消息"的警报,控制台只显示"未捕获的异常:CORRUPT:ccm:tag不匹配&#34 ;

我没有更改加密文本,两个示例之间的唯一区别是我从服务器加密了变量。

任何想法有什么不对?

编辑:

将其存储在DB中的ajax代码:

var url = "action.php?action=r&n="+name+"&pw="+pw_hashed+"&encrypted="+encrypted;
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function()
{
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
    {
        if(xmlhttp.responseText == "success")
        {
            alert("success");
        }
    }
}

接收数据的ajax代码:

var url = "action.php?action=l&n="+name+"&pw="+pw_hashed;
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function()
{
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
    {
        if(xmlhttp.responseText == "success")
        {
            var encrypted = xmlhttp.responseText;;
        }
    }
}

我还将加密后的加密字符串与服务器上的字符串和客户端上的字符串(用于解密)进行比较:所有都是相同的。

1 个答案:

答案 0 :(得分:1)

问题几乎可以肯定在于如何构建查询参数。您需要使用encodeURIComponent对每个参数值进行编码,因为数据可能包含+等字符,除非正确编码,否则将转换为空格。

使用encodeURIComponent

的存储网址
var url = "action.php?action=r&n="+encodeURIComponent(name)+"&pw="+encodeURIComponent(pw_hashed)+"&encrypted="+encodeURIComponent(encrypted);

您的检索网址:

var url = "action.php?action=l&n="+encodeURIComponent(name)+"&pw="+encodeURIComponent(pw_hashed);