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

时间:2014-02-16 04:33:32

标签: c++ mysql qt security

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

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

这是我的代码:

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 

这有点令人担忧。是否有解决方法以便我的密码也被加密?

1 个答案:

答案 0 :(得分:1)

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

  1. 哈希密码
    这使得它在结果.exe中的可读性降低,但请放心,黑客有一个训练有素的眼睛,并会直接识别哈希值。
  2. 将密码分成几部分 这导致密码在.exe

    中分发
    QString part1 = "ace12"
    ... somewhere else 
    QString part2 = "32ef0"
    ... and so on
    ... somewhere else
    QString password = part1 + part2  
    
  3. 你甚至可以在这些部分附上一些垃圾,比如

        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)。这是正确执行此操作的唯一方法。