2013-04-06 18 views
0

簡單代碼:嘗試通過URI發送加密的文本 -/uDDBA造成 「的URIError:URI格式不正確」

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

這是一個非常簡化的版本,其中的異或值是靜態的。在實際情況下,xor值將根據一堆變量進行計算。

假設「/ someuri」不是我自己構建的,而且最初並不是爲了接收加密數據而構建的,我只是試圖使用這個URI。

此外,我的加密算法可以更改。 xor值將使用一個相當簡單的算法使用用戶輸入的密碼和字符的位置生成。

我正在考慮一種方法,使這項工作將是減少可能的輸出字符的總數,並執行某種類型的映射......但我無法真正描繪代碼。

編輯:我選擇的加密的安全

評論表示讚賞;但是,實際的數據安全方面並不重要。我只是想防止「平均」的人能夠讀取輸出加密文本(假設可以有很多很多的)

回答

0

對不起,

我要試圖回答我的問題

運行這段代碼:

(function() { 
    var last = null; 
    for (var idx = 0; idx < 0xffff; idx++) { 
     try { 
      encodeURIComponent(String.fromCharCode(idx)); 
     } catch (e) { 
      if (idx != last + 1) { 
       console.log(idx); 
      } 
      last = idx; 
     } 
    } 
    console.log(last); 
})(); 

這將導致

55296 
57343 

這意味着\ uD800和\ uDFFF之間的任何值都是不允許的。

當我寫這篇文章時,我想我應該寫一個for循環並測試一切。

2

如果您希望普通人不看文字,只需使用POST請求或Base64。

至於實際的安全性,這是完全沒用的。攻擊者不需要知道明文是什麼,他只需要知道用戶發送給您的站點並將相同的數據發回給自己。防止這種情況的唯一方法是在您的網站的任何地方使用SSL。 如果他們想要,他們可以使用您在頁面源代碼中找到的算法來解密它。


JavaScript字符串沒有立即驗證它們的狀態是有點可怕的,因爲它可以基本上免費完成。 Javascript 字符串與UTF-16* encoding關聯,其中並非所有的序列都有效。當不立即遵循0xD800 - 0xDBFF 之間的單位值時,它是無效的0xDC00 - 0xDFFF。如果前面的單元值不是 0xD800 - 0xDBFF,則無效的是0xDC00 - 0xDFFF。

許多事情可能會導致字符串違反這一點,因爲字符串不驗證自己,你只會稍後看到一個錯誤。

你可以一次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; 
    } 
} 
+0

謝謝我會研究你的答案一點。但是對於數據安全的無用性,我想提一件事 - 我不在乎攻擊者是否試圖假裝知道純文本,我真的只關心攻擊者無法讀取純文本。加密的數據顯示在我不擁有的公共網站上,我只希望我和我已經給出密碼的人能夠閱讀它。當然,有人可能會破壞安全,我只想爲普通人提供足夠的東西。 – codefactor 2013-04-06 15:52:01

相關問題