JS:解密后不可能存储在数据库(SJCL)



我正在尝试使用斯坦福Javascript加密库(SJCL),并希望加密和稍后解密字符串。

下面的代码可以正常工作:

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

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

我随后请求加密消息(同样通过ajax)并将其存储在encrypted变量中。之后我想解密它:

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

但是我没有得到一个包含字符串"messages"的警报,控制台只显示"uncaught exception: CORRUPT: ccm: tag doesn't match"。

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

有什么问题吗?

编辑:

将其存储在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;;
        }
    }
}

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

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

您的存储URL使用encodeURIComponent:

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

和您的检索URL:

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

相关内容

  • 没有找到相关文章

最新更新