是否可以在不泄露我的文件的情况下将密码保存在 c++ 文件中

Is it possible to save a password in a c++ file without leaking my file

我正在用 C++ 编写一个 ftp 上传器文件,但我不知道如何在不将密码输入代码的情况下使用该文件登录到 ftp 服务器。这是我的代码:

void UploadFTP(string uploadFile) {
    ofstream ftpFile;
    ftpFile.open("ftpcmd.dat", ios_base::app);
    ftpFile << "user <USER>\n";
    ftpFile << "<PASSWORD>\n";
    ftpFile << "bin\n";
    ftpFile << "put " + uploadFile + "\n";
    ftpFile << "quit";
    ftpFile.close();
    system("ftp -n -s:ftpcmd.dat <FTPSERVER>");
    remove("ftpcmd.dat"); 
} 

如何将登录凭据放入显示 <PASSWORD> 的位置,而不实际将我的密码放在那里。

此外,如果我能在上面写着 system("ftp -n -s:ftpcmd.dat <FTPSERVER>"); 的行中得到任何提示,我想尝试摆脱系统命令。

how to login to the ftp server with the file without putting my password into the code.

您可以选择以下选项之一:

  • 将 FTP 服务器配置为不需要密码
  • 让用户输入密码
  • 将密码存储在程序读取的单独文件中

如果要防止用户查出密码,则没有完整的解决方案。充其量你可以隐藏密码。


I would like to try to move away from the system command.

C++ 没有 FTP 的标准 API。您可以在此处找到规范:https://www.rfc-editor.org/rfc/rfc959。您可能还需要查阅 RFC,更新该 RFC 以支持其他功能,例如被动模式。

C++ 甚至没有运行 FTP 的 TCP 标准 API。但是,您的操作系统可能会为您提供 TCP API。

-s 选项只是从文本文件中获取命令并将其解释为用户输入的命令。ftp 程序将用户的密码作为纯文本接收,无论是否来自 STDIN 或来自文件,因此没有选项可以在 .dat 文件中隐藏密码。

解决方案是完全不使用 system()

在 Windows 上,您可以改用 CreateProcess(),这允许您提供自己的重定向 STDIN 管道,您可以根据需要向其写入数据。在'Nix系统上,可以使用pipe()+dup2()达到同样的效果。

这样,您的命令数据只在内存中,从不在文件中。见Creating a Child Process with Redirected Input and Output, Linux 3.0: Executing child process with piped stdin/stdout

或者,您可以使用实际的 FTP 客户端库。比如Windows'WinInet library, and the libcurl库,都支持FTP操作。还有很多其他支持 FTP 的第 3 方库。

或者,您可以简单地直接在您自己的代码中实现 FTP protocol,使用适用于您的目标平台的通用 TCP 库。