Mysql協(xié)議問題

mysql官方提供的客戶端驅(qū)動,采用的是BIO,基于同步方式;由于工作中需要采用異步方式昌腰,因此打算采用netty重新編寫Mysql的客戶端;按照官方的文檔完成初步工作之后膀跌,測試的時候一直報錯:

mysql_error.png

在確認了賬號和密碼正確無誤之后遭商,初步猜測在于傳到服務(wù)端的密碼部分存在問題:
根據(jù)mysql的官方文檔,加密的算法為:

SHA1( password ) XOR SHA1( "20-bytes random data from server" <concat> SHA1( SHA1( password ) ) )

可以看到是將密碼和salt用SHA1進行加密處理,因此初步猜測是salt獲取錯誤捅伤;那么salt是如何產(chǎn)生的呢劫流?
當(dāng)客戶端連接到mysql服務(wù)器時,服務(wù)器會發(fā)送Initial Handshake Packet,salt就包含在里面:

1              [0a] protocol version
string[NUL]    server version
4              connection id
string[8]      auth-plugin-data-part-1
1              [00] filler
2              capability flags (lower 2 bytes)
  if more data in the packet:
1              character set
2              status flags
2              capability flags (upper 2 bytes)
  if capabilities & CLIENT_PLUGIN_AUTH {
1              length of auth-plugin-data
  } else {
1              [00]
  }
string[10]     reserved (all [00])
  if capabilities & CLIENT_SECURE_CONNECTION {
string[$len]   auth-plugin-data-part-2 ($len=MAX(13, length of auth-plugin-data - 8))
  if capabilities & CLIENT_PLUGIN_AUTH {
string[NUL]    auth-plugin name
  }

其中的auth-plugin-data-part-1和auth-plugin-data-part-2加起來就是salt;在我的程序中丛忆,相應(yīng)的獲取代碼為:

if (protocolVersion > 9) {//獲取salt的第一部分
    packet.readBytes(seed, 8);
    packet.skipBytes(1);//filter:00
  } else {
    BufferUtils.readNullString(packet, seed);
  }
//獲取salt的第二部分
if ((serverCapabilities & CLIENT_SECURE_CONNECTION) != 0) {
    buffer.clear();
    // read string[$len] auth-plugin-data-part-2 ($len=MAX(13, length of auth-plugin-data - 8))
    packet.readBytes(buffer, Math.max(13, authPluginDataLength - 8));
    seed.writeBytes(buffer);
}

可以看到獲取salt的代碼和mysql官方文檔上描述的一致祠汇;檢查了很長時間,問題還是沒有解決蘸际;沒有辦法座哩,只能采用最后的方式:

  1. 用mysql提供的java connector編寫了段簡單的測試程序;
  2. 用Wireshark記錄客戶端和服務(wù)器段的TCP包粮彤;
  3. 從TCP包中取出salt,用自己編寫的代碼將密碼加密根穷,看加密后的結(jié)果和TCP包中是否一致姜骡;

Wireshark記錄的包

server_greeting.png

可以看到salt為:

  1. 第一部分為:0x2a, 0x69, 0x56, 0x50, 0x6f, 0x5e, 0x68, 0x6e
  2. 第二部分為: 0x71, 0x6c, 0x49, 0x69, 0x55, 0x4e, 0x66, 0x39, 0x27, 0x56, 0x5c, 0x4c

我的代碼讀取出來的結(jié)果為:

  1. 第一部分為:0x2a, 0x69, 0x56, 0x50, 0x6f, 0x5e, 0x68, 0x6e
  2. 第二部分為: 0x71, 0x6c, 0x49, 0x69, 0x55, 0x4e, 0x66, 0x39, 0x27, 0x56, 0x5c, 0x4c,0x00

可以看到差異在于,我讀取出來的二進制多了0x00,這是由于這句代碼導(dǎo)致的:

// read string[$len] auth-plugin-data-part-2 ($len=MAX(13, length of auth-plugin-data - 8))
packet.readBytes(buffer, Math.max(13, authPluginDataLength - 8));

改成

BufferUtils.readNullString(packet, buffer);

就可以了屿良。

可以看出mysql官方文檔上的描述:

if capabilities & CLIENT_SECURE_CONNECTION {
string[$len]   auth-plugin-data-part-2 ($len=MAX(13, length of auth-plugin-data - 8))

是有點問題的圈澈;其實在加密算法文檔中

SHA1( password ) XOR SHA1( "20-bytes random data from server" <concat> SHA1( SHA1( password ) ) )

明確說明了salt的長度為20字節(jié),可惜的是自己當(dāng)時沒有注意到尘惧;

Mysql驅(qū)動源碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末康栈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子喷橙,更是在濱河造成了極大的恐慌啥么,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贰逾,死亡現(xiàn)場離奇詭異悬荣,居然都是意外死亡,警方通過查閱死者的電腦和手機疙剑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門氯迂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人言缤,你說我怎么就攤上這事嚼蚀。” “怎么了管挟?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵轿曙,是天一觀的道長。 經(jīng)常有香客問我哮独,道長拳芙,這世上最難降的妖魔是什么察藐? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任皮璧,我火速辦了婚禮,結(jié)果婚禮上分飞,老公的妹妹穿的比我還像新娘悴务。我一直安慰自己,他們只是感情好譬猫,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布讯檐。 她就那樣靜靜地躺著,像睡著了一般染服。 火紅的嫁衣襯著肌膚如雪别洪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天柳刮,我揣著相機與錄音挖垛,去河邊找鬼痒钝。 笑死,一個胖子當(dāng)著我的面吹牛痢毒,可吹牛的內(nèi)容都是我干的送矩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼哪替,長吁一口氣:“原來是場噩夢啊……” “哼栋荸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起凭舶,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤晌块,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后帅霜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摸袁,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年义屏,在試婚紗的時候發(fā)現(xiàn)自己被綠了靠汁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡闽铐,死狀恐怖蝶怔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情兄墅,我是刑警寧澤踢星,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站隙咸,受9級特大地震影響沐悦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜五督,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一藏否、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧充包,春花似錦副签、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至家浇,卻和暖如春本砰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钢悲。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工点额, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留青团,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓咖楣,卻偏偏與公主長得像督笆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子诱贿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 【MySQL】Linux下MySQL 5.5、5.6和5.7的RPM焙蹭、二進制和源碼安裝 1.1BLOG文檔結(jié)構(gòu)圖 ...
    小麥苗DB寶閱讀 10,551評論 0 31
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,163評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理晒杈,服務(wù)發(fā)現(xiàn),斷路器孔厉,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • 從三月份找實習(xí)到現(xiàn)在拯钻,面了一些公司,掛了不少撰豺,但最終還是拿到小米粪般、百度、阿里污桦、京東亩歹、新浪、CVTE凡橱、樂視家的研發(fā)崗...
    時芥藍閱讀 42,253評論 11 349
  • “從前車馬很遠小作,書信很長,一生只夠愛一個人”稼钩。 讀到這一句話顾稀,莫名感動。我們渴望天河倒灌变抽、星月逆行的愛情础拨,如今卻是...
    染言蹊閱讀 211評論 0 0