从 stdin 读取加密密钥是一种糟糕的安全做法吗?

Is reading an encryption key from stdin a bad security practice?

我正在研究一种新的加密实用程序,并且想知道从另一个进程输入加密密钥是否是一种不良的安全做法,或者密钥是否应该通过共享内存或其他类似系统在进程之间发送。换句话说;当内核在进程之间传递缓冲信息时,密钥是否可能 "leak" 到另一个未经授权的进程?换句话说;这里会不会有什么不好的事情发生?

//Read encryption key
unsigned char enc_key[32];
read(STDIN_FILENO,enc_key,32);
//do some encryption/decryption with the key here
memset_s(enc_key,0,32);

通过标准输入传递加密密钥是一种糟糕的安全做法:

  • 首先缓冲流:攻击者可以通过分析进程的内存轻松找到您的密钥。

  • 然后,管道架构使得构建a man in the middle attack变得极其容易,通过密钥就像它来自原始过程一样,但在流程中复制它。

首选替代方案,例如:

  • 两个进程之间的共享内存:这使您可以控制在不再需要时立即清除包含密钥的内存(就像您尝试使用 memset_s()).考虑使用会话密钥加密共享内存的可能性。

  • 使用 SSL 套接字。

请记住,您的密钥应以加密方式存储在内存中,并且只有在需要时才应解密,而且解密时间应尽可能短。请参阅 passwordsafe project 作为代码存储密钥的示例,并牢记安全性。