【问题标题】:Encrypting constant strings(e.g. Password) in compiled executable在编译的可执行文件中加密常量字符串(例如密码)
【发布时间】:2014-02-16 04:33:32
【问题描述】:

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

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

这是我的代码:

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 

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

【问题讨论】:

  • 在某些时候,您将不得不解密密码,因此无论哪种方式,一个有决心的人都可以访问您的数据库。如果您想要一个安全的数据库,那么您应该考虑将它放在服务器上,并让用户登录。但是,当然,如果您将密码硬编码到应用程序中,这将无济于事。

标签: c++ mysql qt security


【解决方案1】:

在应用程序中存储密码通常是一个非常糟糕的主意。
正如 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登录
只要黑客可以破解密码,他就可以立即访问数据库。
4. 使用 SSL 连接到数据库服务器。
即使有上述所有技巧,一个简单的网络嗅探器也可以泄露密码。因此,请务必保护连接。

这些都是外行的方法,保证会被有决心的黑客破解。

如果您真的想要安全,那么您需要使用 SSO 解决方案(请参阅https://www.mysql.com/products/enterprise/security.html)。这是正确执行此操作的唯一方法。

【讨论】:

    猜你喜欢
    • 2011-11-08
    • 2011-10-19
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多