2014-09-21 80 views
1

我已经实现了一个例程,当用户提交表单时,一封电子邮件会发送给管理员。为此,我使用了Java Mail API。我在Microsoft Outlook上设置了一个虚拟帐户来发送电子邮件。在代码中,我已经对密码进行了硬编码。我担心这将是一个安全问题,当我主持的网页。在Java Web应用程序中存储密码变量的不同方法?

这是我的代码。

我写了一个私有函数:

private void getSession(){ 
    this.session = Session.getDefaultInstance(properties, 
    new javax.mail.Authenticator() { 
     protected PasswordAuthentication 
     getPasswordAuthentication() { 
      return new PasswordAuthentication("[email protected]", "xxxxx_password_xxx"); 
     } 
    }); 
} 

在我的公开​​方法我称之为getSession()方法和产生的消息。

public String execute() throws Exception { 
    getSession(); 
    Message message = new MimeMessage(this.session); 
    message.setFrom(new InternetAddress("[email protected]")); 
    message.setRecipients(Message.RecipientType.TO, 
          InternetAddress.parse("[email protected]")); 
    message.setSubject("Form submit notification"); 
    //... 
} 

当我主持网页时,在会话方法中硬编码密码是否安全?

如果没有,那么一些指针来实现替代方案。

谢谢!

+1

可能的重复检查http://stackoverflow.com/questions/8195099/java-how-to-store-password-used-in-application – SoftwareCarpenter 2014-09-21 22:32:02

+1

可以从可执行文件中获取字符串列表。因此,任何访问该文件的人都可以获取这些字符串并猜测密码。 – cliff2310 2014-09-21 22:47:34

回答

3

在这种情况下,他不能散列密码。密码只有在需要CHECKED而没有使用时才能被散列。使用密码(即后端需要登录到SMTP服务器才能发送电子邮件或到另一个数据库以提取数据)意味着需要知道该密码。

在这种情况下,有3 + 1层的替代品,基本上将不安全性从代码转移到其他地方。但攻击者将始终能够根据程序的相同前提条件恢复密码。获得他们的可能性衡量该密码的安全级别。

  1. 在明文,在配置文件 - 密码可以存储在文件系统中的某处 配置文件;显然,如果它是一个 Web应用程序,它不能是webroot,但在其他地方很好保护
  2. 在配置文件中加密;加密/解密密钥必须存储在 不同的文件中,而不是在代码中。这种方法最适用于 这两个文件存储在不同的文件系统中
  3. 在配置文件中加密;在任何文件系统上,加密/解密密钥都不会被存储为 。在启动时向运营商询问是否启动应用程序 ;检查该密钥是否为 正确的密钥(否则,应用程序无法启动),如果是,则将其 存储在内存中。
  4. [不是普通人的真正替代品] HSM硬件安全模块:这种类型的设备以“安全”方式存储密钥和值。这通常意味着服务器(您的 应用程序)具有一个PCI /硬件模块,用于物理授予 连接并检索存储在HSM中的某些密钥。用于解密配置文件的密钥 存储在HSM中,并且由于服务器连接具有PCI硬件的事实,因此 可以检索该密钥并解密配置文件。

这些解决方案

0--密码在SRCS硬编码的风险的耙 - >的风险被连接到容易性代码的检索;反编译提取harcoded字符串是不是即使在C/C++困难,Java和.NET是琐碎和即时

  1. 密码在配置文件中,明文 - >风险连接到方便的检索文件系统中的特定文件;通常这是很难的,因为代码在共享库中存在,在不同的人之间共享,而承载应用的文件系统被更少的人访问
  2. 配置文件中的密码加密 - >风险是上面相同!我知道这听起来很奇怪,但请相信我:用密钥“close”加密或用明文加密的密码是相同的!
  3. 配置文件中的密码,已加密,未存储密钥 - >风险与读取运行密码的服务器中的内存的难易程度有关。在C/C++中,你需要是root AFAIK。在Java中,你可以将它作为启动该进程的同一用户。在这两种情况下,它都需要完全访问系统
  4. 密码在配置文件中加密,在HSM中键 - >您必须获得对服务器的完全控制权,通常是root,然后了解哪个API的HSM必须检索密钥。它连接到完全访问服务器的可能性。

当然,从1到3,实施变得更加困难。 4是HSM的API。

+0

关于使用单向散列身份验证的好处。在我的回答中,我链接到解释存储密码的最佳实践的信息。 – SoftwareCarpenter 2014-09-22 10:21:08

2

这不是一个好的软件实践,可能导致安全问题。

当密码更改时,它也可能导致问题出现。您将不得不重新编译代码才能更新应用程序。

下面是一种不需要硬编码密码的建议方法,因此可以让您的软件更加灵活和安全。

CWE-259: Use of Hard-coded Password

正如上面的链接提示: 应用强大的单向散列到您的密码和这些哈希存储在配置文件或数据库与适当的访问控制。这样,盗窃文件/数据库仍然需要攻击者试图破解密码。在身份验证期间接收到传入的密码时,请取出密码的哈希值并将其与您保存的哈希值进行比较。

为您生成的每个独立哈希使用随机分配的盐。这增加了攻击者进行暴力攻击所需的计算量,可能限制了彩虹表方法的有效性。

+0

谢谢你的回复!这些链接帮助我学习了很多有关确保我缺乏应用程序的知识。 – 2014-09-22 07:28:46

+0

很高兴你找到你需要的东西。用户sc0p答案还提供了一些有关风险/实施方法的良好信息。 – SoftwareCarpenter 2014-09-22 10:25:20

+0

为什么选择投票?为投票添加评论可能会导致更好的答案。 – SoftwareCarpenter 2015-07-27 19:09:49

相关问题