2016/09/29 :
理清了
rsa
的步驟熔萧,所以自己寫了一個。加密思路更清晰明了贮缕。
2016/09/24 :
閑著沒事俺榆,又玩起了模擬登錄。距離上一次寫模擬登錄QQ
已經(jīng)過去很久了定嗓。
抓包
是的萍桌,一切分析源自于抓包。
這是登錄時恃逻,瀏覽器提交的請求參數(shù)。很明顯凸郑,我們需要知道params
和encSecKey
是怎么來的矛市。
分析JS源碼
我們現(xiàn)在瀏覽器里搜索params
,然后成功的找到了尘盼。為了方便操作,我們把它整個復(fù)制到本地文件中配紫。
從上面的截圖我可以知道躺孝,我們需要的參數(shù)來自于window.asrsea
這個函數(shù)底桂。
中間省略我漫長的查找、分析和驗證的過程籽懦。我們來直奔主題吧。
先看傳入的第一個參數(shù)JSON.stringify(bl)
厅篓。
bl
在不同的請求下會有不同的值捶码。這里我只列出它在登錄時的值。
const bl = {
username: '帳號',
password: crypto.createHash('md5').update('密碼').digest('hex'),
rememberLogin: true,
csrf_token: ''
}
關(guān)于后面的三個參數(shù)其實都是定值档押。感興趣祈纯,可以自行推演分析。
//bbZ(['流淚', '強'])
const x = '010001'
//bbZ(Ka.md)
const y = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'
//bbZ(["愛心", "女孩", "驚恐", "大笑"])
const z = '0CoJUm6Qyw8W8jud'
好的掀淘,至此油昂,我們所需要的參數(shù)都有了。那么這個window.asrsea
到底對這個四個參數(shù)做了什么呢拦惋。
加密過程
其實并沒有很復(fù)雜的加密流程安寺。
/*
* 下面我用data替代JSON.stringify(bl)
* 簡要介紹一下,加密流程
*/
window.asrsea(data, x, y, z) {
const str = randomString(16)
const params = AES.encrypt(AES.encrypt(data, z), str)
const encSecKey = rsa(str)
}
解釋一下上面的代碼:
randomString()
是用于生成一個隨機字符串str
言秸,長度為16迎捺。
然后以z
為key
加密原始數(shù)據(jù)。得到結(jié)果后再以str
為key
加密凳枝。將此結(jié)果作為params
。
然后再通過RSA
加密str
叛买。此結(jié)果為encSecKey
蹋订。
這里RSA
加密需要的PublicKey
哪里來的呢。其實就是x
难礼, y
玫锋。
x
轉(zhuǎn)成整數(shù)的值是:65537
。
代碼
移至:github
總結(jié)
也許你們會問谦炬,為什么RSA
加密沒有用Nodejs
自帶的。嗯键思,不是我不想甫贯,而是網(wǎng)易這個RSA
填充方式似乎沒按套路來,也許也是我沒用對赔桌。所以我,就偷懶直接把他的RSA
加密實現(xiàn)從源碼里拿了出來放到了rsa.js
疾党。
如果你用Nodejs
的crypto
實現(xiàn)了,望告知竭钝。
還有目前這個沒有考慮登錄出現(xiàn)驗證碼的情況。
另外香罐,試了一下Chrome
的debugger
时肿。嗯,很棒港令。為什么以前不知道用呢锈颗。
附
網(wǎng)易實現(xiàn)的rsa
應(yīng)該是來自這個:RSA in JavaScript