[英]Why does filtering a QuerySet behave differently for user vs. superuser?
[英]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.