我处于一个棘手的境地,我正在编写一个应用程序,使用我公司的电子邮件帐户向客户发送电子邮件。这里的问题是我必须拥有该帐户的密码才能使服务器上的邮件服务从该帐户发送电子邮件。我知道密码永远不应该以纯文本形式存储,尤其是用于重要电子邮件帐户的密码。这里的困境是程序需要有实际的纯文本密码来发送电子邮件,因此需要将其存储在程序可以访问的地方。该程序使用 MySQL 数据库来存储信息,因此我想到了三个选项:
1) 将密码存储在程序的内存中,即私有的最终字符串字段。
2) 服务器上可以读取密码的文件
3) MySQL 数据库中的某个位置。
我认为 1 是最安全的选择,但是有人有办法处理这种情况,以尽量减少密码落入坏人之手的风险吗?谢谢你的建议!
指出 SMTP 不需要身份验证的评论是正确的。也就是说,三个全部假设服务器使用商用硬件和软件,您指定的选项中有一些是不安全的。我将说明为什么每个都是不安全的,尽管我不会遵循您最初的命令。
2) 服务器上可以读取密码的文件
3) MySQL 数据库中的某个位置。
如果有人窃取服务器怎么办?然后,他们只需打开文件或数据库,读取密码,即可立即访问公司中的所有重要信息。因此,除非你日夜都有武装警卫包围服务器,否则这已经相当不安全了。
但情况变得更糟。没有哪个计算机系统是完全不会受到攻击的,过去几年中几次广为人知的攻击(例如索尼的 PlayStation Network)表明,攻击者无需物理访问即可获取磁盘文件和数据库的内容。此外,从你的问题来看,有问题的服务器似乎是为了接受来自外界的数据包(HTTP 请求、传入电子邮件等),这会增加你的攻击面。
1) 将密码存储在程序的内存中,即私有的最终字符串字段。
这很诱人,但这比选项 2 或选项 3 更有害。一方面,私有最终字符串字段存储在 Java 编译器生成的 .class 文件中,因此使用此选项您已经存储了未加密的密码在服务器的硬盘上。在按照选项 2 或 3 破坏服务器后,攻击者可以运行javap
为了从 .class 文件中获取明文密码。
不过,这种方法会进一步拓宽您的攻击面。如果密码作为源代码的一部分存储,那么突然之间,所有处理该代码的开发人员都可以使用该密码。根据最小权限原则,开发人员不应该知道额外的密码,这是有充分理由的。如果有任何一个开发商的当机器从外部被盗或被入侵时,攻击者可以查看被入侵机器的硬盘并获取明文密码。然后是源代码控制。源代码控制真正重要的好处之一是它允许您检查代码的任何先前版本。因此,即使您将来切换到安全方法,如果密码曾经进入源代码控制,那么源代码控制服务器就是一个潜在的攻击点。
所有这些因素加起来表明,即使 HTTP/邮件服务器的安全性是一流的,选项 1 也会大大增加攻击面,以至于 HTTP/邮件服务器的安全性并没有真正的帮助。
额外的细节:在一开始我指定“假设服务器使用商品硬件和软件”。如果您不使用商用硬件和软件,则可以执行诸如从只读存储启动并仅使用加密数据库之类的操作,从而要求人员在每次启动时提供解密密钥。此后,解密的信息仅存在于内存中,并且永远不会写入磁盘。这样,如果服务器被盗,攻击者必须拔掉服务器的电源,从而丢失仅存在于内存中的所有解密信息。这种设置有时用于 Kerberos KDC(将服务器放在上锁的盒子中以提供额外的安全性),但很少使用其他方式,并且坦率地说,当有一种简单的方法可以解决您的问题而无需执行所有这些额外操作时,这种设置就显得有些过分了费用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)