javascript - 尝试通过 URI -/uDDBA 发送加密文本导致 "URIError: URI Malformed"

标签 javascript unicode uri encryption-symmetric

简单代码:

encodeURIComponent("\uDDBA")

结果:

URIError: URI malformed

我正在尝试进行简单的加密,该加密将获取一些用户输入文本和密码,然后加密该文本并将其保存到服务器。

基本上,我正在尝试对字母“t”进行编码 - 并且算法已确定该字母应该是十六进制的 56762 或 DDBA。

但如果我尝试使用encodeURIComponent 对该字符进行编码,某些十六进制值似乎会导致错误。

我该如何解决这个问题?

我基本上需要知道可以正确通过javascript中的encodeURIComponent的可用字符范围。

目前我正在做这样的事情:

var xor = 0xDDCE;

var plainText = "t".charCodeAt(0);
var encoded = plainText ^ xor;
var encodedChar = String.fromCharCode(encoded);
var uri = "/someuri?character=" + encodeURIComponent(encodedChar);

// This is how i would get the plain text back
var decoded = encodedChar.charCodeAt(0) ^ xor;
var decodedChar = String.fromCharCode(decoded);

这是一个非常简化的版本,其中异或值是静态的。在实际情况下,异或值将根据一堆变量来计算。

假设“/someuri”不是我构建的,并且最初并不是为了接收加密数据而构建的,我只是尝试使用这个 URI。

此外,我的加密算法可以更改。 xor 值将使用相当简单的算法使用用户输入的密码和字符的位置来生成。

我正在考虑实现这项工作的一种方法是减少可能的输出字符总数并执行某种映射......但我无法真正想象出相应的代码。

编辑:

感谢对我选择的加密的安全性发表评论;然而,实际的数据安全方面并不那么重要。我只是想防止“普通”人能够读取输出的加密文本(假设可能有很多)

最佳答案

如果您希望普通人看不到文本,只需使用 POST 请求或 Base64 即可。

对于实际的安全性来说,这是完全没有用的。攻击者不需要知道明文是什么,他只需要知道什么 用户发送到您的网站并将相同的数据发送回自己。防止这种情况的唯一方法是在站点上的所有位置使用 SSL。 如果他们愿意,他们可以使用您在页面源代码中找到的算法来解密。

<小时/>

Javascript 字符串不能立即验证其状态,这有点可怕,因为它基本上可以免费完成。 JavaScript 字符串与 UTF-16* encoding 关联其中并非所有序列都有效。 0xD800 - 0xDBFF 之间的单位值无效 如果不立即跟随,则为 0xDC00 - 0xDFFF。如果先前的单位值不是,则 0xDC00 - 0xDFFF 无效 0xD800 - 0xDBFF。

许多事情都可能导致字符串违反此规定,并且由于字符串不会 self 验证,因此您稍后只会看到错误。

您始终可以一次使用 8 位,并且它会起作用。

var xor = 0xDDCE;

var input = "t",
    output = "",
    i = 0,
    ch;

while( isFinite( ch = input.charCodeAt(i++) ) {
    var xored = ch ^ xor;
    output += String.fromCharCode(
        (xored & 0xFF00) >> 8,
        xored & 0xFF
    );
}

//output is "ݺ", or 0x00DD 0x00BA, each char is always 0x00XX
<小时/>

*规范也允许使用 UCS-2,但我从未见过这一点。如果您想确定:

function areStringsUTF16() {
    try {
        var str = decodeURIComponent("%F0%A0%80%80");
        return str.charCodeAt(0) === 0xd840 &&
               str.charCodeAt(1) === 0xdc00;
    }
    catch(e) {
        return false;
    }
}

关于javascript - 尝试通过 URI -/uDDBA 发送加密文本导致 "URIError: URI Malformed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15846295/

相关文章:

javascript - 获取 span 元素的名称属性

uri - 如何最好地构建 RESTful API 端点

android - 新的 KitKat URI 不响应 Intent.ACTION_VIEW

javascript - 如何将二进制图像数据转换为 nodejs 中同一图像的 URI?

javascript - jquery.zrssfeed.min.js 的回调

javascript - 想要根据给定的年龄计算出生日期

javascript - AngularJS 分页显示所有项目而不是页面项目

javascript - 如何对包含 unicode 字符的 url 进行转义

javascript - Node.js 对 Unicode 的支持如何?

c++ - 您能否访问 ICU MessageFormat 使用的 NumberFormatter