我正在开发一个由多个后端服务和前端客户端组成的应用程序.整个应用程序是用Java编写的,我们使用Apache TomEE webserver来运行它.
后端服务公开了几个API,并包含多个控制器.其中一些API可供前端客户端访问,一些API用于后端服务之间的内部通信.
记录对于此应用程序非常重要.要求在开始正常操作之前始终初始化日志记录系统(以确保完全可追溯性).该应用程序使用安全日志记录系统,该系统需要密钥来初始化日志记录(使用此密钥对日志进行签名以防止篡改日志).还需要将日志记录密钥上载到每个服务.每个后端服务都有一个端点,用于接收日志密钥.
存在"鸡或蛋"类型的问题.应用程序需要运行才能接收密钥,但在收到密钥之前,应用程序也不应完全正常运行.
为了满足这些要求,我们正在考虑以下启动程序:
是否有一种激活端点的标准方法来促进此启动过程?或者无论如何控制对端点的访问.
一些额外的信息:应用程序中的控制器类不扩展任何其他类,并且仅使用@Path和@Stateless注释进行修饰.
我按照使用过滤器的方法(如下面的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) 我有一个可以接收推送通知的现有移动应用程序,并且有一个现有的后端应用程序,该应用程序公开用于向应用程序发送通知的 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
我正在开发一个使用 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) 我有一个对象集合,我希望从这个对象集合中生成一个哈希值(使用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方法会削弱系统的强度吗?