我正在开发一个新的加密实用程序,并且想知道来自另一个进程的加密密钥是否是一个糟糕的安全实践,或者是否应该通过共享内存或其他类似系统在进程之间发送密钥。换一种说法;当内核在进程之间传递缓冲信息时,密钥是否可能“泄漏”到另一个未经授权的进程?换一种说法;可能会发生什么不好的事情吗?
//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);
答案 0 :(得分:2)
通过stdin传递加密密钥是一种不好的安全措施:
首先缓冲流:攻击者可以通过分析进程的内存轻松找到您的密钥。
然后,管道架构使构建a man in the middle attack非常容易,通过密钥就好像它来自原始进程,但是在流程上复制它。
喜欢以下替代品:
两个进程之间的共享内存:这使您可以控制在不再需要它时立即擦除包含密钥的内存(正如您尝试使用memset_s()
)。考虑可能使用会话密钥加密共享内存。
使用SSL套接字。
请记住,您的密钥应自行加密存储在内存中,并且只应在需要时以及尽可能短的密码进行解密。有关安全性的代码,请参阅passwordsafe project作为示例。