豆瓣閱讀器通過 JSON 獲取文章內容,看到的數據格式是被混淆/加密的,這是通過什麼原理實現的?如何將其解碼?

以下是截取的json代碼:

{"data":"M6XaU5P4g6Arj50sU5XkCVK1l9GeU5AsisXjd9XFdj8k32m9U$K0CsA0AFGkltoHASesz2m2U$Kp
AtKRAQKZC2lWAQK5UsA0ARK6djlLltH4UtNsisAsnIX4gRJZg$o1ltK6ASesAsasUtTZASesu2A0
AFPV3FGkltoHASesAsas3$KZltTZlwEsiHpxA

按我的檢查,這個應該就是文章內容。

我的問題是,這個如何解析成可讀文字?


js直接可以看,而且豆瓣的代碼可讀性又十分強,看看就知道了

豆瓣的js裡面,都已經把解密(其實更可以說只是解碼)的代碼封裝成模塊了-"reader/modules/prettify",你甚至可以直接調用這個模塊來進行「解密」

我剛才寫了個簡陋的demo,試驗了《中國式青春》這篇,在這裡:http://play.with.cat/douread/

主要js代碼在這裡 https://gist.github.com/1938892

希望知乎的朋友看到問題能儘力研究後作答,不要提出一堆猜測


從加密方式來看,如樓上所說,MD5和SHA1這種都是摘要加密,是不可逆的,故不可能。

剩下常用的就三種:明文加密(如base64),對稱加密(加密密鑰=解密密鑰),非對稱加密(加密密鑰 != 解密密鑰)

* 非對稱加密一般應用在防止在傳輸過程中篡改內容等方面,如著名的SSL就是基於非對稱來做的(實際是用隨機密鑰對稱加密內容然後非對稱加密對稱密鑰,因為非對稱加解密效率很低)

* 對稱加密沒啥好說的,就是在加密和解密源安全級別相等的情況下使用,比如希望用程序存儲內容到庫中但又不希望被別人直接看出來,效率相對較高

* Base64其實稱之為轉碼更合適,常用場景為去掉字元串中的不可顯示字元,全部轉為可顯示字元以方便傳輸和存儲(樓上說的混淆js代碼也常常採用base64)

douban的JSON沒有研究過,對於樓主的問題,首先對稱加密場景在這裡完全不適合,因為伺服器端加密+客戶端解密這是兩個完全不同安全級別的操作點,故而將加密密鑰暴露給不安全的客戶端絕對是2B的做法。如果為了防止信息篡改用非對稱加密其實說實話還不如用HTTPS,所以也覺得不大可能,而且對於douban的安全場景來看也沒有必要真正去加密某些內容(當然douban的開發小哥要文藝一把也是有可能的)。但不論是對稱還是非對稱,密鑰一定能從豆瓣閱讀的客戶端中找到。另外從常見的工程場景來看,其實Base64可能性更大,可以自己寫代碼或是隨便找個Base64解碼器扔進去試試。

最後,樓上幾位說技術人員砸自己飯碗我不同意,這本身又談不上什麼高深的技術,何況最多就是樓主可以解析douban的閱讀文字,也談不上什麼破壞攻擊。


我個人認為這是為了對付unicode而想出來的


肯定不是MD5這種不可逆加密。可逆加密應該有密鑰,但如果是編譯進去的可能你也不好拿,甚至每次登陸都可變。演算法的話,加密的javascript代碼可以通過eval執行,生成的密文有點類似這樣,你可以查一下。

ps.同上,技術人員別老砸自己人的飯碗

用百度框了把,感覺不是純Base64,解不出什麼有用的東西。文中出現了$和
這種不應該出現的符號,感覺應該是分段編碼加$替換,可能還有些數字變換。不過也有可能改變了Base64的編碼規則,有些變種有將+-替換為其他符號的,比如在這裡可能替換為$、,甚至可能把1、m替換為$、。


這段密文有明顯的統計規律,U5,Ses,sis等都重複出現,和明文比對一下可能找得出加密規則


推薦閱讀:

json 在 Python 爬蟲的應用
XML/HTML/JSON——數據抓取過程中不得不知的幾個概念
一捅到底的架構
Bumpover.js - 牢固而趁手的數據校驗轉換庫

TAG:豆瓣 | JSON | 豆瓣閱讀 |