C++ 在已编译的可执行文件中加密常量字符串(例如密码)

C++ 在已编译的可执行文件中加密常量字符串(例如密码),c++,mysql,qt,security,C++,Mysql,Qt,Security,我创建了一个需要数据库来显示信息的应用程序。没有密码的人不能访问数据库,这是非常必要的 但是当我检查我的可执行文件时,我发现数据库密码是纯文本的 这是我的密码: char pass[20]="MyPassword"; ui->setupUi(this); QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL3"); db.setConnectOptions(); db.setHostName("localhost"); db.setData

我创建了一个需要数据库来显示信息的应用程序。没有密码的人不能访问数据库,这是非常必要的

但是当我检查我的可执行文件时,我发现数据库密码是纯文本的

这是我的密码:

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 
p

这有点令人担忧。是否有一种解决方法可以使我的密码也得到加密?

在应用程序中存储密码通常是一个非常糟糕的主意。
正如user1520427所指出的,即使您加密了密码,您也必须在代码中的某个地方解密它。这意味着它出现在内存中的某个地方。
坚定的黑客可以获取此信息。
通过加密,你让黑客的生活变得更加困难。
因此,您应该知道,如果没有人可以访问您的数据库,那么在应用程序中存储密码是非常必要的,这是绝对不安全的。没有加密可以防止这种情况。
应用一些技术可能会使黑客的生活变得更加困难:

  • 散列密码
    这只会使其在生成的
    .exe
    中的可读性降低,但请放心,黑客有一双训练有素的眼睛,会直接识别散列
  • 将密码分成若干部分
    这将导致在.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) + ...  
    
    三,。不要以root用户身份登录 只要黑客能够破解密码,他就可以立即以root用户身份访问数据库。
    4.使用到数据库服务器的SSL连接。
    即使有了以上所有的诡计,一个简单的网络嗅探器也可以泄露密码。因此,一定要保护好连接

    这些都是门外汉的方法,保证会被坚定的黑客破解


    如果您真的希望安全,那么您需要使用SSO解决方案(请参阅)。这是正确执行此操作的唯一方法。

    在某个时候,您必须解密密码,以便有决心的人可以通过任何一种方式访问您的数据库。如果你想要一个安全的数据库,那么你应该考虑把它放在一个服务器上,并让用户登录。但是,当然,如果您将该密码硬编码到应用程序中,这将毫无帮助。