小编use*_*604的帖子

如何在Java应用程序中有选择地停用REST端点?

我正在开发一个由多个后端服务和前端客户端组成的应用程序.整个应用程序是用Java编写的,我们使用Apache TomEE webserver来运行它.

后端服务公开了几个API,并包含多个控制器.其中一些API可供前端客户端访问,一些API用于后端服务之间的内部通信.

记录对于此应用程序非常重要.要求在开始正常操作之前始终初始化日志记录系统(以确保完全可追溯性).该应用程序使用安全日志记录系统,该系统需要密钥来初始化日志记录(使用此密钥对日志进行签名以防止篡改日志).还需要将日志记录密钥上载到每个服务.每个后端服务都有一个端点,用于接收日志密钥.

存在"鸡或蛋"类型的问题.应用程序需要运行才能接收密钥,但在收到密钥之前,应用程序也不应完全正常运行.

为了满足这些要求,我们正在考虑以下启动程序:

  1. 以简化操作模式启动后端服务,其中每个服务中唯一可访问的端点是用于接收传入密钥的端点.
  2. 一旦接收到密钥,并且日志系统初始化,则激活其他端点,并开始正常操作.

是否有一种激活端点的标准方法来促进此启动过程?或者无论如何控制对端点的访问.

一些额外的信息:应用程序中的控制器类不扩展任何其他类,并且仅使用@Path@Stateless注释进行修饰.


更新1

我按照使用过滤器的方法(如下面的Bogdan所建议的).我创建了一个捕获所有请求的过滤器.应用程序正确启动.init()调用过滤器类中的方法.但是当我访问/installkey端点时会发生错误.

似乎发生的是doFilter(ServletRequest, ServletResponse, FilterChain)调用该方法,并且我的代码检测到请求是针对/installkey端点的.但是电话错误来自:filterChain.doFilter(request, response);.

我已经检查过,而且我知道变量filterChain不是null,但是在方法中doFilter(ServletRequest, ServletResponse, FilterChain)出了问题,我无法调试它.

可能,我没有初始化需要初始化的东西.

我添加了下面的输出.

现在我有以下内容web.xml:

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>com.company.filter.LoggingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)

以下课程:

public class LoggingFilter implements Filter {

    @Override
    public void init(final FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(final ServletRequest request, 
                         final ServletResponse response, 
                         final FilterChain …
Run Code Online (Sandbox Code Playgroud)

rest endpoint java-ee tomee

8
推荐指数
2
解决办法
4365
查看次数

在 AWS 上使用 Firebase Cloud Messaging (FCM) 发送通知时是否需要使用 Amazon SNS?

我有一个可以接收推送通知的现有移动应用程序,并且有一个现有的后端应用程序,该应用程序公开用于向应用程序发送通知的 API。后端应用程序使用 Firebase Cloud Messaging (FCM),因此它可以被视为 FCM 的包装器。我的后端应用程序使用 Firebase Admin SDK 创建消息并将其发送到 Firebase。我的客户点击了我的后端应用程序公开的 API(因此,如果我们假设客户正在使用 Postman,那么发送消息的流程为:Postman->我的后端应用程序->Firebase->移动应用程序)。

到目前为止,我一直在本地服务器上运行后端应用程序,并且运行良好。但现在我需要在 AWS 上部署它。我的问题是:是否有必要使用Amazon SNS?我实际上并不需要 AWS 提供任何其他功能,我只是希望 AWS 允许所需的通信。

例如,我不需要进入 AWS 界面输入令牌即可将消息发送到我的手机。我已经通过后端公开了一个用于发送消息的 API。那么,我是否应该费心去设置 SNS 呢?

我知道至少我必须让我的 Firebase 项目 google 凭证可供我在 AWS 上的实例使用(位于使用 GOOGLE_APPLICATION_CREDENTIALS 指定的路径中的文件中)。还需要哪些其他配置步骤?多谢。

push-notification amazon-web-services amazon-sns firebase-cloud-messaging

8
推荐指数
1
解决办法
1672
查看次数

Log4j - 如何从 log4j 隐藏启动配置消息

我正在开发一个使用 log4j (1.7.10) 的命令行应用程序。

在log4j.xml中,应用配置了4个appender,用于不同类型的日志,如下图:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
debug="true">

<appender name="console" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{ISO8601} %-5p %c{1}:%L - %m%n" />
    </layout>
</appender>

<appender name="regularAppender" class="org.apache.log4j.RollingFileAppender">
    <param name="maxBackupIndex" value="10" />
    <param name="file" value="./target/logs/develop.log" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{ISO8601}|%p|%t|%m%n" />
    </layout>
</appender>

<appender name="errorsAppender" class="org.apache.log4j.RollingFileAppender">
    <param name="maxBackupIndex" value="10" />
    <param name="file" value="./target/logs/errors.log" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{ISO8601}|%p|%t|%m%n" />
    </layout>
</appender>

 <!-- with keystore in config -->
 <appender name="secure-appender" class="com.company.slogger.SecureAppender">
    <param name="file" value="./target/logs/secure.log" …
Run Code Online (Sandbox Code Playgroud)

logging log4j startup

4
推荐指数
1
解决办法
999
查看次数

通过使用hashCode()的输出作为SHA256的输入,在生成一组对象的哈希时,任何安全强度的损失

我有一个对象集合,我希望从这个对象集合中生成一个哈希值(使用SHA256).

这些散列这些对象的过程是零知识证明系统的一部分,其中证明者生成证明,该证明稍后由验证者验证.这个证明实际上是哈希函数的输出.

这些对象都包含3或4个大的BigInteger值(大小为2048位).对象的数量是可变的,但它将在4到10之间.

我编写了以下方法,用于从可变数量的对象生成哈希值:

public byte[] buildHashFromHashcodes(final Object... listOfObjects) {

    for (Object obj : listOfObjects) {

        if (obj == null) {
            throw new Exception(
                "Input objects cannot be null");
        }

        _md.update(intToBytes(obj.hashCode()));
    }

    return _md.digest();
}

private byte[] intToBytes(final int intValue) {
    return new byte[] {(byte) (intValue >> 24),
            (byte) (intValue >> 16), (byte) (intValue >> 8),
            (byte) intValue };
}
Run Code Online (Sandbox Code Playgroud)

我的问题与在此代码中使用hashCode方法有关.具体来说,我试图确定hashCode方法的使用是否会削弱系统的安全性,因为它只生成一个32位数,因此只在每次迭代期间使用32位信息更新散列.因此,我不确定此过程中此信息的丢失是否真的会削弱系统.

这些对象的hashCode方法的实现使用大的BigInteger值来生成它们的哈希码,但是在返回之前该数字被截断为int.

我担心的部分原因是,某些对象的哈希码之间可能存在冲突.但话说回来,哈希在循环内部被多次更新,因此单个冲突不会是一个大问题.

让我们假设对象集合中有4个对象.在循环的第一次迭代中,将使用32位来更新散列,在第二次迭代中,将使用另外32位来更新散列,等等.

据我所知,在调用update方法之后执行散列算法.不是128位(4个对象)将存储在缓冲区中,然后使用这128位作为输入执行散列算法.

因此,我们可以说在最终更新之后哈希所处的状态总数将是(2 ^ 32)*(2 ^ 32)*(2 ^ 32)*(2 ^ 32)?(在实践中,这当然不会发生,因为它会在某些时候被截断).

我相信使用hashCode是一种安全的方法,因为在每次迭代期间都会调用update方法.

为了避免对象之间发生冲突的风险,另一种方法是使用每个对象的toString()方法,该方法返回一个包含每个对象的全部熵的String(大BigInteger数字的值包含在字符串).这意味着在循环的每次迭代期间使用更多信息更新散列,但我不确定是否有必要.

所以,我的问题是,在这段代码中使用hashCode方法会削弱系统的强度吗?

java cryptography hashcode sha256 information-theory

0
推荐指数
1
解决办法
368
查看次数