装了一款日记扩展程序在谷歌浏览器上。文件可导出,但是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=
为例,实际上应该是由bc1b639b39ba9379e162a2d2e489c2722e6cd2798878269e22551cc580b74ca6
和U2FsdGVkX1+iLBffvi9p6kprVPEDCCRNB5uhTzJRbiE=
两部分组成,前者应该是某种hash,只是用来校验的,没有实际数据存储;后者应该是AES/DES/RC4/Rabbit/TripleDes
加密的其中之一,毕竟U2Fsd
开头太特征了,而这些加密算法无一例外都是需要密钥的(当然也并不是必须,但那就失去加密的意义了)。
所以作者在导出数据的时候压根就没打算让你去用到其他地方,大概率是用来备份数据然后方便在自己软件内恢复的。
考虑到是浏览器扩展, 可以尝试看下源码.
浏览器插件的话,甚至可能可以直接对背景页上开发者工具,在展示逻辑里直接上个断点把内部已解码状态的数据 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,可用其他程序进一步处理。
谢谢!受教了!