簡體   English   中英

在INSERT和UPDATE上,mysql加密的行為是否有所不同?

[英]Does mysql encrypt behave differently on INSERT vs UPDATE?

我正在編寫一個快速的REST服務來管理我們域的電子郵件帳戶,並遇到了一個我無法解釋的奇怪行為。

我使用mysql來驗證電子郵件帳戶,我們的REST服務使用Web界面管理maildirs並插入或更新auth憑證。 插入用戶以及更新密碼的查詢都使用encrypt mysql命令。

奇怪的是,在REST接口上更改密碼至少一次之前,插入的用戶將無法進行身份驗證。 這意味着encrypt正在為更新設置正確的值,但插入有問題。

我已經嘗試在休息服務端的GET / POST參數中記錄所有內容,看起來數據庫層出現了問題。 REST服務在兩個端口記錄密碼的params。 執行查詢時的某些內容是不同的。

我的查詢看起來像這樣(在Python中使用MySQLdb):

ADD_USER = "INSERT INTO users (id,name,maildir,crypt) VALUES (%s,%s,%s,encrypt(%s));"

CHANGE_PASS = "UPDATE users SET crypt = encrypt(%s) WHERE id=%s"

同樣, ADD_USER正在輸入一個錯誤的哈希值,其中CHANGE_PASS成功,並且傳遞給它們的crypt (作為字符串)具有完全相同的HTTP參數。 有沒有理由為什么數據層會進行不同的加密,或者我咆哮錯誤的樹?

首先:如果您可以提供幫助,請不要使用ENCRYPT()作為密碼。 它有點受限(例如:它忽略了密碼的前8個字符以外的所有內容),並且它不是特別安全,特別是因為它意味着MySQL查詢日志記錄將記錄用戶的密碼! 你可以更好地在Python中進行密碼散列 - 這意味着不僅MySQL不必知道任何有關實際密碼的信息,而且還允許你使用更強大的密碼散列算法。

盡管如此,請記住, ENCRYPT()不是純哈希函數。 除非你傳入salt作為第二個參數,否則它的結果不是常數。 你是如何檢查密碼的? 一個正確的解決方案看起來像:

SELECT * FROM users WHERE <...> AND crypt = ENCRYPT(%s, crypt) ...

或者,在Python中:

row.crypt == crypt.crypt(users_input_password, row.crypt)

如果你使用不帶鹽的加密,它將使用基於當前時間的鹽,所以每次你調用它,你會得到一個不同的哈希:

mysql> select encrypt('test');
+-----------------+
| encrypt('test') |
+-----------------+
| 92SErC2PadiaQ   |
+-----------------+

mysql> select encrypt('test');
+-----------------+
| encrypt('test') |
+-----------------+
| A2jgxXgOJx7ls   |
+-----------------+

前兩個字符(在標准情況下)是鹽。 如果你想檢查它,你使用舊密碼作為salt,除了前兩個字符之外的所有字符都被忽略:

mysql> select encrypt('test', 'A2jgxXgOJx7ls');
+----------------------------------+
| encrypt('test', 'A2jgxXgOJx7ls') |
+----------------------------------+
| A2jgxXgOJx7ls                    |
+----------------------------------+

如果你想要更強的密碼,你必須使用特殊的鹽:

mysql> select encrypt('test', '$1$12345678$') as md5;
+------------------------------------+
| md5                                |
+------------------------------------+
| $1$12345678$oEitTZYQtRHfNGmsFvTBA/ |
+------------------------------------+

mysql> select encrypt('test', '$5$0123456789abcdef$') sha256;
+-----------------------------------------------------------------+
| sha256                                                          |
+-----------------------------------------------------------------+
| $5$0123456789abcdef$Wm4jf6bGxEoelzY0H/fTvcw8Qcshq0hyLaRfZWtN8q. |
+-----------------------------------------------------------------+

mysql> select encrypt('test', '$6$0123456789abcdef$') as sha512;
+------------------------------------------------------------------------------------------------------------+
| sha512                                                                                                     |
+------------------------------------------------------------------------------------------------------------+
| $6$0123456789abcdef$vNATSYYTivQfXwPTUT4q.sRFLs/sgxDXaPipzRlX3WOO4r1NcR.Og5OoU2Cd2agm1WA3pCJ30JU4EKMxpZaDy/ |
+------------------------------------------------------------------------------------------------------------+

所以這一切都取決於你使用的鹽。 永遠不要使用無鹽的哈希。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM