Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中安全地存储运行时密码_C_Email_Client_Password Protection_Password Encryption - Fatal编程技术网

在C中安全地存储运行时密码

在C中安全地存储运行时密码,c,email,client,password-protection,password-encryption,C,Email,Client,Password Protection,Password Encryption,我目前正在用C编写一个邮件客户端。但是我对存储密码有一个问题 我只想在程序运行时存储它。 由于密码是一个“字符串”,我可以将其存储在一个字符数组中,在程序结束前不久,该数组会被覆盖。但这将相对不安全 如何在程序运行期间安全地存储密码?您完全可以避免以明文形式保存密码 如果您必须保留密码(例如,您需要定期将其发送到服务器),最好以加密形式保存密码。哪种加密形式由您决定。这使得对程序进行内存分析的人更难看到密码。(更难,并非不可能;如果您必须将密码发送到服务器,并且有人可以物理访问计算机以进行内存分

我目前正在用C编写一个邮件客户端。但是我对存储密码有一个问题

我只想在程序运行时存储它。 由于密码是一个“字符串”,我可以将其存储在一个字符数组中,在程序结束前不久,该数组会被覆盖。但这将相对不安全


如何在程序运行期间安全地存储密码?

您完全可以避免以明文形式保存密码

如果您必须保留密码(例如,您需要定期将其发送到服务器),最好以加密形式保存密码。哪种加密形式由您决定。这使得对程序进行内存分析的人更难看到密码。(更难,并非不可能;如果您必须将密码发送到服务器,并且有人可以物理访问计算机以进行内存分析,那么您所能做的就是使其变得困难。)

使用时,您可以执行以下操作:

  • 分配一个临时数组
  • 解密到数组
  • 使用数组(例如,向服务器发送密码)
  • 覆盖数组
  • 释放阵列
如果你想成为真正的偏执狂,在覆盖数组时,按顺序执行几项操作,例如(这只是一个示例):

  • 全零
  • 所有的
  • 选择一个随机字节值
  • 用该字节值填充数组
  • 用位移一次的值再次填充
  • 再次填充位移位的值
  • 再次使用第三次移位的值填充
  • 再次填充第四次位移位的值
  • 再次填充第五次位移位的值
  • 再次填充第六次位移位的值
  • 再次填充第七次移位的值
  • 所有的
  • 全零

…很显然,一些研究人员有时能够通过对RAM中的记忆细胞进行法医学分析来检索先前数据的回声。但我认为这属于偏执狂的范畴。(但这样做很便宜。;-)

嗨,谢谢你的快速回答,但我知道我还有第二个问题。当我加密我的密码并将其保存在数组中时,我的程序必须再次解密它,因此当“攻击者”knw代码时,他解密保存在数组中的加密密码不是很容易吗?你能给我一个提示或链接让我进一步阅读吗?@user3852496:的确,他们会的,但是现在他们不只是查看程序的内存并运行模式匹配来查找可能是密码的东西,他们必须找到你在哪里进行解密。正如我所说,你不能让一个对机器拥有完全控制权的人无法获取信息,你所能做的只是让它变得更加困难。(很抱歉,我没有任何特定的链接。)再次感谢,你有什么建议可以帮助我避免模式匹配找到我的密码数组,或者我应该在哪里进行解密,或者我的en-和解密函数?:-)@用户3852496:恐怕不行。不是我的专长领域。