Playframework 迁移到播放2.5.3-加密库已弃用,但也可能已损坏?

Playframework 迁移到播放2.5.3-加密库已弃用,但也可能已损坏?,playframework,playframework-2.0,Playframework,Playframework 2.0,当前在尝试将应用程序移动到2.5.3时收到此错误 Error injecting constructor, java.lang.RuntimeException: The global crypto instance requires a running application! 我正在努力克服近1000个错误(到目前为止已报告-一旦我清除了一批错误,那么就很低了,然后又出现了另一批错误,因此可能会有更多错误) 然而,我似乎无法掌握如何解决这个问题。《迁移指南》指出该库已弃用,将被删除,并提供

当前在尝试将应用程序移动到2.5.3时收到此错误

Error injecting constructor, java.lang.RuntimeException: The global crypto instance requires a running application!
我正在努力克服近1000个错误(到目前为止已报告-一旦我清除了一批错误,那么就很低了,然后又出现了另一批错误,因此可能会有更多错误)

然而,我似乎无法掌握如何解决这个问题。《迁移指南》指出该库已弃用,将被删除,并提供了替换路径——其中没有一个看起来微不足道——但它没有指出如何根据运行应用程序的需要实例化该库

确实在github问题中发现了一些闲聊,但没有具体到实际问题

我现在只需要
Crypto.encryptAES
Crypto.decrypteaes
替换,如果库无法正确启动,则可以使用快速子库

这个问题目前停止发挥死在它的轨道顺便说一句,所以我不知道下一步是什么,一旦我过去这个问题

DI应该会处理这个问题,但它显然没有

下面是我看到的堆栈跟踪的相关部分:

1错误
位于com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1025)
位于com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1051)
at play.api.inject.guice.GuiceInjector.instanceOf(guiceinjectbuilder.scala:405)
at play.api.inject.guice.GuiceInjector.instanceOf(guiceinjectbuilder.scala:400)
at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:123)
at play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21)
在play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1$$anonfun$2.apply(DevServerStart.scala:158)
在play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1$$anonfun$2.apply(DevServerStart.scala:155)
在播放时.utils.Threads$.withContextClassLoader(Threads.scala:21)
在play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:155)
... 省略了15个公共框架
原因:java.lang.RuntimeException:全局加密实例需要一个正在运行的应用程序!
在scala.sys.package$.error处(package.scala:27)
at play.api.libs.Crypto$$anonfun$Crypto$1.apply(Crypto.scala:56)
at play.api.libs.Crypto$$anonfun$Crypto$1.apply(Crypto.scala:56)
在scala.Option.fold处(Option.scala:158)
atplay.api.libs.Crypto$.Crypto(Crypto.scala:57)
at play.api.libs.Crypto$.encryptAES(Crypto.scala:78)


我用它来发现这一点:希望它能提供一些线索,但我仍然不知道如何解决这个问题

这里有几个Scala中的AES对称加密示例,您可以使用以下内容替换Play的加密:

我猜您正在使用
Crypto.encryptAES
作为游戏外的静态方法。它使用一个全局实例,该实例需要一个正在运行的应用程序,因为它使用applicationCache()。(顺便说一句,这就是为什么Play在可能的情况下删除静态方法和全局状态,因为有可能进入这样的状态,即在没有应用程序的情况下调用方法。)

在任何情况下,
Crypto
都是其他三个类的包装器。您要做的是实例化一个
AESCTRCrypter
,它具有
encryptAES

这将使用CryptoConfig,您将从CryptoConfigParser获得:

这需要一个环境和一个配置——它们上面有很多文档和工厂方法,所以我不会在这里详细介绍

完成后,可以使用静态方法创建自己的包装器类

但是,也不推荐使用AESCTRCrypter,因为这不是对称加密的安全使用。因为它已被弃用且不安全,它将在未来版本的Play中消失,然后这些编译错误将是永久性的,如果您希望在不修改的情况下维护AES-CTR,您将不得不编写自己的替换对称加密代码

迁移指南中列出了推荐的库,在中有一个示例项目

此外,还有一个名为JNCryptor的AES库,可在Maven上使用,由CossackLabs推荐:


org.cryptonode.jncyptor

.

FYI:你可能会认为,告诉你你在最后一个库的播放文档实际上可能会很好地告诉你如何实际安装下一个库……谢谢James——这给了我足够的时间让网站运行——现在进入下一批警告(另外,我认为阿诺姆刚刚破坏了数据库……是的,我知道也有一个巧妙的答案……)您好,James——您链接的示例使用AES/ECB,这是不安全的,也不是Play 2.4.x使用的,因此即使它们编译,也可能无法正确加密和解密。谢谢@WillSargent。您可以从Maven Central获得JVM上对称加密的安全选项吗?