【问题标题】:Migration to Play 2.5.3 - Crypto library deprecated but also perhaps broken?迁移到 Play 2.5.3 - 加密库已弃用但也可能已损坏?
【发布时间】:2016-05-09 20:38:56
【问题描述】:

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

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

我正在处理近 1000 个错误(到目前为止报告过 - 一旦我清除了一批然后很低,然后看到另一批出现了,所以可能会有更多)

但是,我似乎无法掌握如何修复这个特定问题。迁移指南表明该库已被弃用并将被删除并提供替换路径——这些路径都不是微不足道的——但它没有说明如何根据正在运行的应用程序来实例化库。

确实在 github 问题中发现了一些喋喋不休,但没有针对实际问题。

如果库无法正确启动(如果可以快速子),我(现在)只需要替换 Crypto.encryptAESCrypto.decryptAES

这个问题目前阻止了 Play dead 顺便说一句,所以我不知道一旦我解决了这个问题,接下来会发生什么。

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

【问题讨论】:

  • 仅供参考:您会认为 Play 文档告诉您在绳子尽头使用一个库可能实际上足以告诉您如何实际安装下一个库...跨度>

标签: playframework playframework-2.0


【解决方案1】:

我猜您正在使用 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 有一个示例项目。

此外,在 Maven 上还有一个名为 JNCryptor 的 AES 库,由 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢詹姆斯——这给了我足够的支持让网站运行——现在进入下一批警告(另外我认为异常只是破坏了数据库......是的,我知道有一个巧妙的答案那也是……)
    • 嗨 James - 您链接的示例使用 AES/ECB,它不安全,也不是 Play 2.4.x 使用的,所以即使它们编译,它们也可能不会加密并正确解密。
    • 谢谢@WillSargent。您可以从 Maven Central 获得 JVM 上的对称加密的任何安全选项吗?
    猜你喜欢
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2016-01-26
    相关资源
    最近更新 更多