我正在用java开发一个web应用程序。在开发电子邮件发送器时,我必须指定主机的凭据(电子邮件和密码)。
我正在做这样的事情:
public void sendEmail(String toAddress,
String subject, String message) throws AddressException,
MessagingException {
// sets SMTP server properties
Properties properties = new Properties();
properties.put("mail.smtp.host", smtp.gmail.com);
properties.put("mail.smtp.port", 587);
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.starttls.enable", "true");
// Sender's email ID needs to be mentioned
final String username = "user_mail";
final String password = "password_mail";
// creates a new session with an authenticator
Authenticator auth = new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
};
Session session = Session.getInstance(properties, auth);
// creates a new e-mail message
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(username));
InternetAddress[] toAddresses = { new InternetAddress(toAddress) };
msg.setRecipients(Message.RecipientType.TO, toAddresses);
msg.setSubject(subject);
msg.setSentDate(new Date());
// set plain text message
msg.setText(message);
// sends the e-mail
Transport.send(msg);
}
我认为使用凭据的更好的做法是将它们保存在xml文件中,并使用一些方法(也许是上下文的方法)回叫它们。
有人可以解释我(或给我一些链接,我可以看到)我怎么能做到这一点或一些更好的?
任何帮助都将不胜感激。
一种有趣的方法是使用Vault。这是一个管理"秘密"的系统,比如凭据、API密钥等。
你还可以做一些其他的事情,比如编写一些代码来自动加密和解密密码。
根据经验,确保不在生产机器上安装JDK也很重要。如果你这样做了,黑客就可以访问javap
,也就是Java反汇编器。输出不会那么好,但可能足以大致了解用于保护密码的方法。
这取决于您想在隐藏秘密方面投入多少精力。最后,您必须将凭据存储在某个地方。您可以加密它们,但无论如何都必须将加密密钥存储在某个地方。
许多(甚至是成熟的)系统只是简单地将用户名/密码存储在配置文件中,并依靠主机来保证系统的安全。有些系统对密码进行加密,但加密密钥无论如何都可以在配置和密钥存储库中的某个地方获得。它使找回你的电子邮件密码稍微复杂一点,但不是很多。
我见过的最安全的方法是基于配置的秘密(密码)和一些环境属性(IP, MAC,…)创建密钥。
让我们实际一点。在大多数情况下,将SYSTEM凭据存储为plain是可以的。您必须安全访问您的系统,所以应该没有办法获得配置文件。