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

问题描述 投票:3回答:2

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

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

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

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

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

我需要的所有(现在)是Crypto.encryptAESCrypto.decryptAES替换,如果可以快速sub,如果库无法正常启动。

这个问题目前停止玩死了它的轨道btw因此我不知道一旦我通过这个问题后会发生什么。

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希望它可能会有所启发,但我仍然不知道如何解决。

playframework playframework-2.0
2个回答
2
投票

我猜你正在使用Crypto.encryptAES作为Play之外的静态方法。它使用全局实例,它需要一个正在运行的应用程序,因为它使用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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.