迁移到Play 2.5.3 - Crypto库已弃用但也可能已损坏?

时间:2016-05-09 20:38:57

标签: playframework playframework-2.0

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

Error injecting constructor, java.lang.RuntimeException: The global crypto instance requires a running application!

趟过接近1000个错误(到目前为止报告 - 一旦我清理了批次然后低了,看到另一批显示,所以可能还有更多)

然而,我似乎无法解决如何解决这个问题。迁移指南表明该库已被弃用,将被删除并提供替换路径 - 这些路径看起来都不重要 - 但它并没有说明如何在需要运行的应用程序的情况下实例化库。

在github问题上找到了一些喋喋不休但没有具体针对实际问题。

如果可以快速创建子库,则无法正常启动库,我需要(现在)Crypto.encryptAESCrypto.decryptAES替换。

这个问题目前停止播放死机的轨道顺便说一下,所以当我遇到这个问题后,我不知道接下来会发生什么。

DI应该会处理这个问题,但显然不会。

这是堆栈跟踪的相关部分我看到了:

1 error at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1025) at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1051) at play.api.inject.guice.GuiceInjector.instanceOf(GuiceInjectorBuilder.scala:405) at play.api.inject.guice.GuiceInjector.instanceOf(GuiceInjectorBuilder.scala:400) at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:123) at play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21) at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1$$anonfun$2.apply(DevServerStart.scala:158) at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1$$anonfun$2.apply(DevServerStart.scala:155) at play.utils.Threads$.withContextClassLoader(Threads.scala:21) at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:155) ... 15 common frames omitted Caused by: java.lang.RuntimeException: The global crypto instance requires a running application! at 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) at scala.Option.fold(Option.scala:158) at play.api.libs.Crypto$.crypto(Crypto.scala:57) at play.api.libs.Crypto$.encryptAES(Crypto.scala:78)

我用它来找到这个:https://github.com/playframework/playframework/blob/2.5.3/framework/src/play/src/main/scala/play/api/libs/Crypto.scala希望它可能会有所启发,但我仍然不知道如何处理。

2 个答案:

答案 0 :(得分:2)

我猜你在Play之外使用Crypto.encryptAES作为静态方法。它使用全局实例,它需要一个正在运行的应用程序,因为它使用applicationCache()。 (顺便说一下,这就是为什么Play会尽可能地删除静态方法和全局状态,因为有可能进入这样的状态,在这种状态下调用方法而没有应用程序。)

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

https://github.com/playframework/playframework/blob/2.5.3/framework/src/play/src/main/scala/play/api/libs/crypto/Crypto.scala#L350

这使用CryptoConfig,你可以从CryptoConfigParser获得:

https://github.com/playframework/playframework/blob/2.5.3/framework/src/play/src/main/scala/play/api/libs/crypto/Crypto.scala#L463

将采用环境和配置 - 这些都有很多文档和工厂方法,所以我不会在那里详细介绍。

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

但是,AESCTRCrypter也已弃用,因为这不是对称加密的安全使用。因为它已被弃用且不安全,所以它将在未来版本的Play中消失,然后这些编译错误将是永久性的,如果您想要维护AES-CTR而不进行修改,则必须编写自己的替换对称加密代码。

迁移指南中列出了推荐的库,https://github.com/playframework/play-kalium处有一个示例项目。

此外,还有一个名为JNCryptor的AES库,可在Maven上使用,由CossackLabs推荐:https://cossacklabs.com/choose-android-crypto.html

https://github.com/RNCryptor/JNCryptor

<dependency> <groupId>org.cryptonode.jncryptor</groupId> <artifactId>jncryptor</artifactId> <version>1.2.0</version> </dependency>

编辑:截至2018年,我建议您使用Google Tink

答案 1 :(得分:0)

以下是Scala中的几个AES对称加密示例,您可以用以下内容替换Play的加密: https://gist.github.com/alexandru/ac1c01168710786b54b0 https://gist.github.com/sapardi/2828070