Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.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
Java/Mysql服务器程序中电子邮件帐户密码的存储_Java_Mysql_Email_Passwords - Fatal编程技术网

Java/Mysql服务器程序中电子邮件帐户密码的存储

Java/Mysql服务器程序中电子邮件帐户密码的存储,java,mysql,email,passwords,Java,Mysql,Email,Passwords,我在一个棘手的情况下,我写的应用程序,发送电子邮件给客户使用我的公司的电子邮件帐户。这里的问题是,我必须拥有该帐户的密码,才能让服务器上的邮件服务从该帐户发送电子邮件。我知道密码永远不应该以纯文本形式存储,尤其是用于重要电子邮件帐户的密码。这里的困境是,程序需要有实际的纯文本密码才能发送电子邮件,因此它需要存储在程序可以访问的地方。该程序使用MySQL数据库存储信息,因此我认为有三种选择: 1) 将密码存储在程序的内存中,即私有的最终字符串字段 2) 服务器上的文件,可从中读取密码 3) 在My

我在一个棘手的情况下,我写的应用程序,发送电子邮件给客户使用我的公司的电子邮件帐户。这里的问题是,我必须拥有该帐户的密码,才能让服务器上的邮件服务从该帐户发送电子邮件。我知道密码永远不应该以纯文本形式存储,尤其是用于重要电子邮件帐户的密码。这里的困境是,程序需要有实际的纯文本密码才能发送电子邮件,因此它需要存储在程序可以访问的地方。该程序使用MySQL数据库存储信息,因此我认为有三种选择:

1) 将密码存储在程序的内存中,即私有的最终字符串字段

2) 服务器上的文件,可从中读取密码

3) 在MySQL数据库的某个地方


我认为1是最安全的选择,但有没有人有办法处理这种情况,以尽量减少密码落入坏人手中的风险?谢谢你的建议

如果你真的想保证它的安全,你可以对密码进行编码,然后把它放在2或3中。当您需要使用它时,只需让您的程序对其进行解码并将其作为普通字符串保存在内存中即可


String decodedDurl=urldecker.decode(url,“UTF-8”)

这是一个常见问题。您可以将密码存储在MYSQL中的blob字段中,在insert上应用AES加密;在java中使用并保留密钥字符串以方便解密

MYSQL语法:

AES\u加密(str,key\u str)

AES\u解密(crypt\u str,key\u str)

插入内容类似于以下内容:

插入t值(1,AES_ENCRYPT('password','encryption_key')

你会用密钥解密出来的

选择AES_DECRYPT(密码,'encryption_key')作为t中的未加密密码

因此,尽管需要加密密钥,但您永远不会在应用程序中以纯文本形式存储密码。您与数据库的连接应该是安全的。日志可能是一个问题


或者,您可以使用存储的进程来获取密钥,或者您可以在服务器端加密密钥,并在加密后插入/检索。

指出SMTP不需要身份验证的注释是正确的。也就是说,假设服务器使用商品硬件和软件,那么您指定的所有三个选项都是不安全的。我会说明为什么每一个都是不安全的,虽然我不会按照你原来的顺序

2) 服务器上的文件,可从中读取密码

3) 在MySQL数据库的某个地方

如果有人偷了服务器怎么办?然后,他们可以打开文件或数据库,读取密码,并立即访问公司的所有重要信息。因此,除非你日夜在服务器周围有武装警卫,否则这已经相当不安全了

但情况变得更糟了。没有一个计算机系统是完全不受攻击的,在过去几年中,几次广为人知的攻击(例如索尼的PlayStation网络)表明,攻击者可以在不进行物理访问的情况下访问磁盘文件和数据库的内容。此外,从您的问题来看,所涉及的服务器似乎是为了接受来自外部世界的数据包(HTTP请求、传入的电子邮件等),这会增加您的攻击面

1) 将密码存储在程序的内存中,即私有的最终字符串字段

这很诱人,但比方案2或方案3更有害。首先,私有的final string字段存储在Java编译器生成的.class文件中,因此使用此选项,您已经在服务器硬盘上存储了未加密的密码。在按照选项2或3破坏服务器后,攻击者只需运行
javap
,即可从.class文件中获取明文密码

不过,这种方法会进一步拓宽您的攻击面。如果密码作为源代码的一部分存储,那么所有正在编写代码的开发人员都可以使用它。在最小特权原则下,开发者不应该知道额外的密码,这里有一个很好的理由。如果开发人员的任何计算机被窃取或从外部泄露,攻击者可以通过泄露计算机的硬盘驱动器查看并获取明文密码。然后是源代码管理。源代码管理的一个真正重要的好处是,它允许您检查代码的任何先前版本。因此,即使将来切换到安全方法,如果密码曾经进入过源代码管理,那么源代码管理服务器也是一个潜在的攻击点

所有这些因素加起来表明,即使HTTP/mail服务器的安全性是一流的,选项1也会增加攻击面,以至于HTTP/mail服务器的安全性实际上没有帮助



额外细节:在开始时,我指定了“假设服务器使用商品硬件和软件”。如果您不使用商品硬件和软件,您可以从只读存储引导,并且只使用加密数据库,每次引导时都需要一个人提供解密密钥。此后,解密后的信息只保存在内存中,永远不会写入磁盘。这样,如果服务器被盗,攻击者就必须拔掉服务器的插头,从而丢失内存中仅有的所有解密信息。这种类型的设置有时用于Kerberos KDC(服务器位于锁定的盒子中以提供额外的安全性),但在其他情况下很少使用,坦白地说,如果有一种简单的方法可以解决您的问题,而不需要付出所有额外的费用,那么这种设置就太过繁琐了。

您可以发送带有自定义
发件人:
标题的电子邮件,而不必使用该帐户
String encodedUrl = URLEncoder.encode(url,"UTF-8");