![](/img/trans.png)
[英]Encryption in ASP.NET that can be decrypted in MySQL with AES_DECRYPT()
[英]MySQL AES_DECRYPT in NodeJS, placeholder for encryption key?
我發現了類似的回復,但沒有什么真正簡單的。 AES_DECRYPT 如何僅用於在 NodeJS 中使用 MySQL 擴展的查詢中的密碼字段? 我所擁有的如下:
app.post("/verify",function(req,res){
connection.query('SELECT *, FROM `bosses` where u=? and p=?', [req.body.user,req.body.pass], function (error, results, fields) {
if(results.length){
session.loggedin=1;
res.redirect('/zirkus');
}else{
res.redirect('/soccer');
}
});
我假設我需要使用以下內容修改查詢:
connection.query('SELECT *, FROM `bosses` where u=? and p=AES_DECRYPT (?, 'ENCRYPTIONKEY')', [req.body.user,req.body.pass], function (error, results, fields) {
但不知何故,我無法讓它正常工作。 我也應該為加密密鑰使用占位符嗎?
編輯
感謝您對為什么這通常是一個壞主意的回復和解釋:)
這是一個變體:代碼中沒有存儲解密密碼:
connection.query('SELECT *, AES_DECRYPT(p, ?) AS `key` FROM bosses WHERE u = ?', [req.body.pass, req.body.user], function (error, results, fields) {
console.log (req.body.pass + req.body.user )
if(results[0].key){
session.loggedin=1;
res.redirect('/zirkus');
}else{
res.redirect('/soccer');
}
});
});
在這里,管理員用戶在表單中鍵入解密密碼,如果解密成功(密鑰返回 true),它允許用戶登錄(不使用或保存密碼),否則訪問被拒絕。
我假設在這個解決方案中唯一的缺點是 mysql 日志對嗎?
答案 1:不要使用加密來存儲用戶密碼。 使用散列。
永遠沒有理由需要解密用戶密碼。 相反,當用戶登錄時,您 hash 他們的輸入具有相同的散列 function 並將結果與存儲在數據庫中的 hash 字符串進行比較。
嘗試 bcrypt: https://www.npmjs.com/package/bcrypt
另請閱讀https://blog.codinghorror.com/youre-probably-storing-passwords-incorrectly/
答案 2:我從不在 SQL 表達式中進行加密或散列。 原因是如果您使用查詢日志,它將包含敏感內容的明文,就像它出現在 SQL 表達式中一樣。 它也將在 PROCESSLIST 中可見。
相反,如果您需要對敏感內容進行加密或散列,請在您的應用程序代碼中進行,然后在 SQL 語句中使用結果。
重新編輯:
我假設在這個解決方案中唯一的缺點是 mysql 日志對嗎?
不,問題是您使用可逆加密存儲密碼。 沒有理由撤銷用戶密碼。 如果我訪問一個提供“密碼恢復”功能的網站,他們可以告訴我我的密碼是什么(不管他們做了多少其他安全檢查),那么我知道他們存儲的密碼是錯誤的。
如果密碼以可逆的加密格式存儲,這會產生除我之外的其他人可以反轉加密並讀取我的密碼的可能性。 散列永遠不會發生這種情況,因為您無法通過反向散列來獲取原始內容。
如果是因為日志......?
當然,您可以禁用查詢日志。 但是還有其他地方可以看到查詢,例如:
在您編輯的示例中,他們可以在上述任何上下文中查看用戶的明文解密密鑰。
... 為什么 MySQL 有這個 function ...?
除了用戶密碼之外,還有其他合法的加密用途。 有時您確實需要解密加密的內容。 我只是在談論用戶密碼。 正如我在此答案頂部所述,無需解密即可對用戶密碼進行身份驗證。 它包含在我鏈接的博客中,也作為我的書SQL 反模式:避免數據庫編程的陷阱中的一章。
SQL 中加密和相應解密 function 的另一種用途是在您將代碼開發為存儲過程時。 必須將加密數據返回給客戶端應用程序只是為了對其進行解密,然后將其發送回您的存儲過程以進行進一步處理,這將是不方便的。
您必須使用雙引號作為解密密鑰或 escaping ut
connection.query('SELECT *, FROM `bosses` where u=? and p=AES_DECRYPT (?, "ENCRYPTIONKEY)', [req.body.user,req.body.pass], function (error, results, fields) {
if(results.length){
session.loggedin=1;
res.redirect('/zirkus');
}else{
res.redirect('/soccer');
}
});
但就像在每種語言中一樣,密碼通常只存儲為散列值,因此即使使用日志也不容易重建它們。 所以 chelkc 例如https://coderrocketfuel.com/article/using-bcrypt-to-hash-and-check-passwords-in-node-js
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.