如何解密Json格式的文件?

装了一款日记扩展程序在谷歌浏览器上。文件可导出,但是json格式。我只能看到一堆编码。如何能正常看这个文件?或是如何转成能看的格式?

json 可以直接用文本编辑器打开的呀

估计是uriencode编码了。

你可以把你「看到的一堆編碼」截個圖,我們才可以幫到你。有可能是uri編碼,也有可能unicode轉了碼。

这是json文件用记事本打开后的样子

[
   {
      "date":"00/00/0000",
      "timestamp":1651051249264,
      "value":"bc1b639b39ba9379e162a2d2e489c2722e6cd2798878269e22551cc580b74ca6U2FsdGVkX1+iLBffvi9p6kprVPEDCCRNB5uhTzJRbiE="
   },
   {
      "date":"04/26/2022",
      "timestamp":1650978660765,
      "value":"5054a908fd0b35c3ed18d83035a3ddef23316ab39d8f9e437ab530be3aa2003dU2FsdGVkX1+0xKlgwviVp+7HojaHGXa7aQqs0NazYuZzjp5C26Dde2Vy1F0/CLsGKTj7qacZwPlGUVTw7pOuH82Yng+AMELKKAf2kMHqqLCBjQCy6E86hEtH0LWDlCEI5++U/zUW8FN3jZG87ZdxWoY4a+NBIGK3iRqW6FRkxtXmc/fMR7jKJpyvCRsQOVzzFdmL3NZc3F1FdUxqCriz/5gmov5dZotwAClQGf9CqHHa3EcL1fX+0BiIvpI4WCCCQTvLBN+Ei2ROdJxTqWvNIcKSkcB9M5Fb6gr5+ARYveVnZ/TT4K4KFIklZ6ANtpxyFHXvNu3/SHIqBUmLlmR53iCp8AdMR5HDd8jYxgbSA7QS2UEDfxXNZAhjncMpGjpbcrvnQlqMsdegWLgKu9MAOp4+Jm5YyRAp2EpDOrjIqszuIX6s49OV4QvfXoYnkIza+Ad42bxbPRmAOuEyXI5Rs7CpIwJcnlf4XnALoG3jOhPz7TzuVMQOzEgnmC5F2Ud0"
   },
   {
      "date":"05/04/2022",
      "timestamp":1651042795932,
      "value":"7f137d25ae7037aebfa66f898febc8acada57a000a43dafb588b436bd58f6452U2FsdGVkX1+9qX8sQsOMouhi0sknscjnUKc8KhypvL/8N130YfZeyTozJarv/2BQhQ4Xy06ajUIQTUPcDBVM+i1E4r/PmIQJ5Z+mPYl6zDV7A1gVxllLgklm/pKQrYwahdx5prVprD9Azb4ZOpv36ybjY1isG0rR5baHWxyq6zI87MFTHBoGpdHuMfAucUB8kt7Mb6if6xEsqkg8SnUPoyJ+h6gvp6J1XmpyRRs373fv06yNyfalNVHxRAWaAIn8"
   },
   {
      "date":"DD/DD/DDDD",
      "timestamp":1651025133092,
      "value":"b0e928b2dc6fe81c2e5184f4a9b6ee40f26c5b1fec12c2c1e46dcac7eb8fa42cU2FsdGVkX1+aBjhtpP0QTq6+V4WPWsz7grBAPk+ImheMk2h4oyd1GsJv5+rgCE6eyYoMnpT3GcdtzbdZGQ2qxE2atrg7OcLrGUGyG0WJjZs="
   },
   {
      "date":"SS/SS/SSSS",
      "timestamp":1651026156969,
      "fontFamiliesList":[
         {
            "text":"ABeeZee",
            "key":"ABeeZee",
            "value":"ABeeZee"
         },
         {
            "text":"Abel",
            "key":"Abel",
            "value":"Abel"
         },
         {
            "text":"Abhaya Libre",
            "key":"Abhaya Libre",
            "value":"Abhaya Libre"
         },
         {
            "text":"Abril Fatface",
            "key":"Abril Fatface",
            "value":"Abril Fatface"
         }
      ]
   }
]

后面的值加密了. 你需要知道算法和密码才行.

再正常不过的json了……json又不是代表里面所有的内容都是原始未加密的

是加密的,以开头的bc1b639b39ba9379e162a2d2e489c2722e6cd2798878269e22551cc580b74ca6U2FsdGVkX1+iLBffvi9p6kprVPEDCCRNB5uhTzJRbiE=为例,实际上应该是由bc1b639b39ba9379e162a2d2e489c2722e6cd2798878269e22551cc580b74ca6U2FsdGVkX1+iLBffvi9p6kprVPEDCCRNB5uhTzJRbiE=两部分组成,前者应该是某种hash,只是用来校验的,没有实际数据存储;后者应该是AES/DES/RC4/Rabbit/TripleDes加密的其中之一,毕竟U2Fsd开头太特征了,而这些加密算法无一例外都是需要密钥的(当然也并不是必须,但那就失去加密的意义了)。

所以作者在导出数据的时候压根就没打算让你去用到其他地方,大概率是用来备份数据然后方便在自己软件内恢复的。

3 Likes

考虑到是浏览器扩展, 可以尝试看下源码.

浏览器插件的话,甚至可能可以直接对背景页上开发者工具,在展示逻辑里直接上个断点把内部已解码状态的数据 dump 出来?只是一个猜想

比我想的复杂了一点,这个这么干,显然是作者没打算让你直接看。导出就是为了导入而已。个插件,可以尝试逆向,考虑一下投入产出的价值吧。

不如把拓展的名字贴出来~

my secret diary

逆向了一下,日记数据以加密形式存储在浏览器的 IndexedDB 中,其中 value 由 SHA256 HMAC 和 AES 加密后的 HTML 拼接而成。相关代码在插件背景页的 index.js 380 行左右(格式化后),如下图。

如果需要把加密后的 JSON 文件解密,可以用以下 Node.js 脚本(需要先安装 crypto-js 库),将 password 替换为自己的密码明文,然后把 JSON 文件改名为 diary.json 放置于脚本所在目录下,最后运行即可。

const CryptoJS = require("crypto-js"); // npm install crypto-js
const fs = require("fs");

let diaryItems = JSON.parse(fs.readFileSync("diary.json", "utf8")).filter(
    item => item.date != "SS/SS/SSSS" && item.date != "00/00/0000"
);

// NOTE: REPLACE PASSWORD HERE!
let password = "password" 

console.log(`loaded ${diaryItems.length} items`);

let decryptedItems = diaryItems.map(item => {
    let rawValue = item.value
    let hmac = rawValue.slice(0, 64)
    let encrypted = rawValue.slice(64)

    let validHmac = (hmac === CryptoJS.HmacSHA256(encrypted, CryptoJS.SHA256(password)).toString())
    let decrypted = CryptoJS.AES.decrypt(encrypted, password).toString(CryptoJS.enc.Utf8)

    let decodedItem = {...item, decrypted, validHmac, hmac}
    return decodedItem
})

console.log(`finished!, decrypted ${decryptedItems.length} items`)

fs.writeFileSync("diary_decrypted.json", JSON.stringify(decryptedItems))

运行完毕会得到 diary_decrypted.json 文件,其中每一个日记项的 decrypted 属性存储了明文 HTML,可用其他程序进一步处理。

5 Likes

谢谢!受教了!