簡體   English   中英

在編譯的可執行文件中加密常量字符串(例如,密碼)

[英]Encrypting constant strings(e.g. Password) in compiled executable

我創建了一個需要數據庫才能顯示信息的應用程序。 非常重要的是,沒有密碼的任何人都不能訪問數據庫。

但是,當我瀏覽可執行文件時,發現數據庫密碼是純文本格式。

這是我的代碼:

char pass[20]="MyPassword";
ui->setupUi(this);
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL3");
db.setConnectOptions();
db.setHostName("localhost");
db.setDatabaseName("DB");
db.setUserName("root");
db.setPassword(pass);

這是我在.exe二進制文件中找到的內容:

p< S       |   t¼  t¬    ?   @   €   0   @  €  À 0 @   €  MyPassword  QMYSQL3 localhost   DB 

這有點令人擔憂。 是否有解決方法,以便我的密碼也得到加密?

通常,在應用程序中存儲密碼是一個非常糟糕的主意。
如user1520427所示,即使您加密了密碼,也必須在代碼中的某處解密它。 這意味着,它出現在內存中的某個位置。
堅定的黑客可以獲取此信息。
通過加密,使黑客的生活更加困難。
因此,您應該知道,如果絕對沒有人可以訪問您的數據庫,則在應用程序中存儲密碼永遠都不安全。 沒有加密可以防止這種情況。
應用某些技術可能會使黑客的生活更加困難:

  1. 散列密碼
    這使得它在生成的.exe可讀性,但請放心,黑客的眼睛是訓練有素的,可以直接識別哈希值。
  2. 將密碼分成幾段
    這導致密碼在.exe中分發

     QString part1 = "ace12" ... somewhere else QString part2 = "32ef0" ... and so on ... somewhere else QString password = part1 + part2 

您甚至可以在這些零件上附加一些垃圾,例如

    QString part1 = "ace12acaae2b1ccc0e969709665bc62f"  
    QString part2 = "32ef031ec4b7ad76b6270bd8c8f971d0"
    ...
    QString password = part1.leftRef(5) + part2.leftRef(5) + ...  

3.不要以root身份登錄
只要黑客能夠破解密碼,他就可以立即對數據庫進行root訪問。
4.使用與數據庫服務器的SSL連接。
即使有上述所有技巧,簡單的網絡嗅探器也可以顯示密碼。 因此,請務必同時保護連接。

這些是外行的方法,並保證會被堅定的黑客破解。

如果您確實真的想安全,那么您需要使用SSO解決方案(請參閱https://www.mysql.com/products/enterprise/security.html )。 這是正確執行此操作的唯一方法。

暫無
暫無

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

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