当前位置: 首页 > 面试题库 >

在Java Web应用程序中存储密码变量的不同方法?[关闭]

羊舌青青
2023-03-14
问题内容

我实现了一个例程,当用户提交表单时,会将电子邮件发送给管理员。为此,我使用了Java Mail API。我设置了一个虚拟帐户,用于发送电子邮件。在代码中,我对密码进行了硬编码。我担心在托管网页时这将是一个安全问题。

这是我的代码。

我写了一个私有函数:

private void getSession(){
    this.session = Session.getDefaultInstance(properties,  
    new javax.mail.Authenticator() {
        protected PasswordAuthentication 
        getPasswordAuthentication() {
            return new PasswordAuthentication("xxxxxxxxx@outlook.com", "xxxxx_password_xxx");
        }
    });
}

在我的公共execute()方法中,我调用该getSession()方法并生成消息。

public String execute() throws Exception {
     getSession();
     Message message = new MimeMessage(this.session);
     message.setFrom(new InternetAddress("xxxxxxxxxxxxx@outlook.com"));
     message.setRecipients(Message.RecipientType.TO, 
                          InternetAddress.parse("admins.email@xxxxx.com"));
     message.setSubject("Form submit notification");
     //...
}

托管网页时,在会话方法中对密码进行硬编码是否安全?

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

谢谢!


问题答案:

在这种情况下,他无法对密码进行哈希处理。仅当需要检查而不使用密码时,才可以对密码进行哈希处理。使用密码(即后端需要登录到SMTP服务器以发送电子邮件,或登录到另一个数据库以提取数据)意味着需要知道它。

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

  1. 以明文形式在配置文件中-密码可以存储在文件系统中某个位置的配置文件中;显然,如果它是一个Web应用程序,则一定不能是Webroot,而应在其他受良好保护的地方
  2. 在配置文件中加密;加密/解密密钥必须存储在其他文件中,而不是代码中。当两个文件存储在不同的文件系统中时,此方法最适用
  3. 在配置文件中加密;加密/解密的密钥未存储在任何文件系统上。在启动时要求启动该应用程序的操作员。检查该密钥是否正确(否则,应用程序无法启动),如果正确,则将其存储在内存中。
  4. [不是普通人的真正替代品] HSM硬件安全模块:这种类型的设备以“安全”的方式存储密钥和值。这通常意味着服务器(您的应用程序)具有一个PCI /硬件模块,该模块从物理上授权连接并检索存储在HSM中的某些密钥。用于解密配置文件的密钥存储在HSM中,由于连接的服务器具有PCI硬件,因此它可以检索该密钥并解密配置文件。

这些解决方案的风险

0-用srcs硬编码的密码->风险与检索 代码 的容易性有关; 即使在C / C
++中,反编译以提取经编码的字符串也不难,在Java和.NET中是微不足道的,即时的

  1. 配置文件中的密码,明文->风险与文件 系统中 特定文件的容易获取有关;通常,这比较困难,因为代码是在存储库中共享的,并且在不同的人之间共享,而托管该应用程序的文件系统的访问较少
  2. 配置文件中的密码已加密->风险 上面 相同 !我知道这听起来很奇怪,但请相信我:使用“接近”密钥加密的密码或使用明文加密的密码是相同的!
  3. 配置文件中的密码,已加密,没有密钥存储->风险在于与读取运行密码的服务器中的 内存 有关。在C / C ++中,您需要是根AFAIK。在Java中,您可以与启动该进程的用户相同。在这两种情况下,都需要完全访问系统
  4. 配置文件中的密码(已加密)是HSM中的密钥->您必须完全控制服务器(通常是root用户),然后了解HSM必须检索哪个API。它具有 完全访问服务器 的可能性。

当然,从1到3,实现变得更加困难。4是HSM的api问题。



 类似资料:
  • 问题内容: 我正在开发一个从数据库读取一些数据的应用程序。通过标准登录/密码机制执行与数据库的连接。 问题是:如何存储数据库密码?如果我将其存储为类成员,则可以通过反编译操作轻松检索它。 我认为混淆并不能解决问题,因为在混淆代码中也可以轻松找到字符串密码。 有人有建议吗? 问题答案: 切勿将密码硬编码到您的代码中。最近在最危险的25个编程错误中提到了这一点。 将秘密帐户和密码硬编码到您的软件中非常

  • 从属性文件读取密码后,将其存储在静态变量中是否安全?我看到有一些关于密码不应存储在字符串(java)中的最佳实践,但我找不到有人讨论在应用程序的整个生命周期中如何将密码存储在静态(字符串/字符[])变量中。 将密码存储在静态变量中会导致密码暴露于外部世界的额外威胁吗?是否应该在创建与外部系统的连接后设置密码变量?

  • 我正在使用jQuery mobile和Spring MVC开发一个包含多页模板的移动应用程序。我有一个包含锚链接的jsp;每当我单击链接时,就会调用事件并执行jQuery函数。我从函数中的链接获得了一个id,并将其存储在jQuery变量中。现在我想重用jstltag中jQuery变量的值,该值在核心标记库中可用。如何使用该值?这是我的jsp:

  • 我正在用Firebase和Angular5构建一个web应用程序。我想创建/加入私人房间(受密码保护)。 目前,我正处于数据库设计阶段,无法真正了解如何在不从firebase数据库中实际检索的情况下检查用户输入的正确房间密码(从而使其完全不安全)。 我应该为此使用云功能吗。或者直接用firebase就可以了,而我错过了什么?

  • 我想调用一个名称(带或不带圆括号和参数)存储在字符串变量中的方法,并使用该变量调用该方法。 到目前为止,我发现在Java中,如果您这样做: 这将调用方法。但我认为这是不推荐的。所以,我的问题是: 谢了。

  • 我已经创建了一个自定义用户存储提供程序,它将根据需要将用户从遗留系统迁移到KeyCloak的本地存储。