2018年10月2日

[MYSQL] C/Python Connector API for MySQL

MySQL client 登入時可以藉由提供一個 option file (比方說 .mylogin.cnf) 並且在裡面寫好 user / password / host 等資訊後,登入時直接使用 option file 連上 MySQL server。不過 option file 因為必須是明文,自然會有風險。只是 MySQL 自 5.6 版以後提供了 mysql_config_editor 這支 utility 讓使用者可以把 option file 加密 (目前看到的資料好像是會用 AES 128bit 加密) 來避免這個問題。

想當然爾,MySQL 也必須提供 API 讓使用者可以藉由這些 API 直接使用這些加密後的 option file 連上 MySQL server。這邊介紹的是關於官方原生提供的 C/Python API 上的狀況。

C 的 API 基本上裝完 MySQL 應該就會看到了,官方說明文件也滿好找的。基本上只要利用 mysql_options 這支 API 就能把 option file 讀進來讓 mysql_real_connect 可以去連線。只是裡面有個小陷阱要特別注意,官方文件上有特別提到:
The client group is always read if you use MYSQL_READ_DEFAULT_FILE or MYSQL_READ_DEFAULT_GROUP. 
所以你的 option file 如果沒有 client 這個 group 是不給你跟 server 連線的,就算你想用的 group 不是 client。

python 的話官方提供的套件是 mysql-connector,可以利用 pip 來安裝。不過 python 套件有個大問題 (不過其實是大部分的 python 套件都有類似狀況),就是雖然可以指定利用 option file 連上 MySQL server,但是如果 option file 是經過加密的,沒有一個能用 = =...

OK,基本上這種半殘的狀況很弔詭,特別是連官方原生的套件都有這種問題就很奇怪,後來才發現有另一個非官方的 python 套件叫 myloginpath,基本上用途就是把加密後的 option file 給解密,藉此拿到所有要建立連線所需的資訊,比方說最重要的 host/user/password。藉由 myloginpath 拿到所要的資訊後自然我們就能利用任何一個 python MySQL connector 套件連上 MySQL server。

好的,我相信有些人有注意到其中有一個奇怪的小地方:myloginpath 能直接解密拿到明文,那當初加密是弄辛酸的嗎?說實在的,我也覺得是弄辛酸的...特別是當我發現我能毫無障礙的拿到密碼並且印出來後我真得覺得這加密是在搞笑的...

好的,結論是這東西看起來有麼點保障,實際上完全是坨屎,大概就是這樣。然後要搞清楚這東西要怎麼處理還得花費上大把時間去搞清楚原來官方的套件不支援,實在有夠弱...

沒有留言:

張貼留言