【发布时间】:2019-06-30 00:26:54
【问题描述】:
我正在尝试在 Linux 命令行上使用相同的密码更方便地安装多个 Veracrypt 卷。由于 Veracrypt 仅支持 GUI 模式下的密码短语缓存,因此我编写了以下代码来为我完成这项工作:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<time.h>
int main(int argc, char* argv[]){
if(argc > 1 && argc%2==1){
srand(time(0));
//prevent veracrypt from asking for user's passphrase
system("sudo echo -n");
char *buffer = getpass("Veracrypt Password:");
for(int i = 1; i<argc; i+=2){
char* cc;
cc = (char *) malloc(57+strlen(argv[i])+1+strlen(argv[i+1]));
strcpy(cc, "veracrypt -t --protect-hidden=no --keyfiles=\"\" --pim=123 ");
strcat(cc, argv[i]);
strcat(cc, " ");
strcat(cc, argv[i+1]);
FILE* fChild = popen(cc, "w");
fprintf(fChild, "%s", buffer);
pclose(fChild);
free(cc);
}
for(int i = 0; i<strlen(buffer); i++)
buffer[i] = rand();
}
return 0;
}
代码有效,但我想知道执行后密码是否从内存中正确删除。如上面的代码所示,密码短语在开头被读入 char-arraybuffer,最后被替换为随机值。
我的两个问题是:
这种方法是个好主意吗? (安全方面)
buffer 的值如何通过 popen() 传送到 veracrypt? / buffer 是直接从它的位置读取,还是被复制,因此可以保留在内存中的某个位置?
【问题讨论】:
-
对我来说似乎很好。您不会在内存中留下任何密码痕迹。从 popen() 开始,我不确定它是否被缓冲
标签: c linux pipe popen veracrypt