javascript - JS : Decryption not possible after storing in database (SJCL)

标签 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)并将其存储在变量 encrypted 中。之后我想解密它:

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

但我没有收到包含字符串“messages”的警报,控制台仅显示“未捕获的异常:CORRUPT:ccm:标签不匹配”。

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

知道哪里出了问题吗?

编辑:

将其存储在数据库中的 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 对每个参数值进行编码,因为数据可能包含诸如 + 之类的字符,除非正确编码,否则这些字符将被转换为空格。

使用 encodeURIComponent 的存储 URL:

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);

关于javascript - JS : Decryption not possible after storing in database (SJCL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30425767/

相关文章:

javascript - 使用 JQuery/Ajax 获取 session 值

vb.net - VB.NET 的 AES 加密标准库?

java.lang.IllegalAccessError : tried to access class javax. crypto.Cipher$从类 javax.crypto.Cipher 转换

encryption - 是否可以将非对称 key 作为您自己的 key (BYOK) 提供给任何云提供商的云 KMS( key 管理服务)?

javascript - 如何对每 x 项的 JSON 项进行分组

没有源元素的 JavaScript getComputedStyle?

c# - Javascript "var obj = new Object"在 C# 中等效

javascript - 如何在同一页面上异步显示表单发布数据(不刷新页面)?

jquery - 在 AJAX 刷新后保持打开的可折叠面板打开

javascript - 更新成功时 jQuery 数据表显示跨度