簡體   English   中英

NodeJS中的MySQL 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 日志對嗎?

不,問題是您使用可逆加密存儲密碼。 沒有理由撤銷用戶密碼。 如果我訪問一個提供“密碼恢復”功能的網站,他們可以告訴我我的密碼是什么(不管他們做了多少其他安全檢查),那么我知道他們存儲的密碼是錯誤的。

如果密碼以可逆的加密格式存儲,這會產生除我之外的其他人可以反轉加密並讀取我的密碼的可能性。 散列永遠不會發生這種情況,因為您無法通過反向散列來獲取原始內容。

如果是因為日志......?

當然,您可以禁用查詢日志。 但是還有其他地方可以看到查詢,例如:

  • 二進制日志(如果您使用基於語句的二進制日志)
  • 進程主義者
  • performance_schema 語句表
  • MySQL 網絡協議。 也就是說,如果你不使用 TLS 來加密應用程序和數據庫之間的連接,那么有人可能會截獲網絡上的數據包並看到帶有明文內容的明文查詢。

在您編輯的示例中,他們可以在上述任何上下文中查看用戶的明文解密密鑰。

... 為什么 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.

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