§应用程序密钥
Play 使用密钥用于以下事项,包括
- 签名会话 Cookie 和 CSRF 令牌
- 内置加密实用程序
它在 application.conf
中配置,属性名为 play.http.secret.key
,默认值为 changeme
。正如默认值所暗示的那样,它应该在生产环境中更改。
注意:在启动时,如果 Play 发现密钥未设置,或设置为
changeme
,或应用程序密钥太短,Play 将抛出错误。
§最佳实践
任何可以访问密钥的人都可以生成任何他们想要的会话,有效地允许他们以任何他们想要的用户的身份登录到您的系统。因此,强烈建议您不要将应用程序密钥检入源代码控制。相反,它应该在您的生产服务器上配置。这意味着将生产应用程序密钥放在 application.conf
中被认为是不好的做法。
在生产服务器上配置应用程序密钥的一种方法是将其作为系统属性传递给您的启动脚本。例如
/path/to/yourapp/bin/yourapp -Dplay.http.secret.key='QCY?tAnfk?aZ?iwrNwnxIlR6CTf:G3gf:90Latabg@5241AB`R5W:1uDFN];Ik@n'
这种方法非常简单,我们将在 Play 文档中使用这种方法来运行您的应用程序在生产模式下,作为提醒应用程序密钥需要设置。但是,在某些环境中,将密钥放在命令行参数中不被认为是好的做法。有两种方法可以解决这个问题。
§环境变量
第一种方法是将应用程序密钥放在环境变量中。在这种情况下,我们建议您在application.conf
文件中放置以下配置
play.http.secret.key="changeme"
play.http.secret.key=${?APPLICATION_SECRET}
该配置中的第二行将密钥设置为来自名为APPLICATION_SECRET
的环境变量,如果设置了此环境变量,否则它将密钥保持为上一行的值不变。
这种方法特别适用于基于云的部署场景,在这些场景中,通常的做法是通过环境变量设置密码和其他密钥,这些环境变量可以通过该云提供商的 API 进行配置。
§生产配置文件
另一种方法是创建一个production.conf
文件,该文件位于服务器上,包含application.conf
,但也覆盖任何敏感配置,例如应用程序密钥和密码。
例如
include "application"
play.http.secret.key="QCY?tAnfk?aZ?iwrNwnxIlR6CTf:G3gf:90Latabg@5241AB`R5W:1uDFN];Ik@n"
然后,您可以使用以下命令启动 Play:
/path/to/yourapp/bin/yourapp -Dconfig.file=/path/to/production.conf
§应用程序密钥的要求
应用程序密钥配置play.http.secret.key
会检查最小长度,具体取决于用于签署会话和闪存 cookie 的算法。默认情况下,该算法是 HS256,它至少需要 256 位。因此,如果密钥的位数少于此,则会抛出错误,配置无效。对于 HS256,您可以通过将密钥设置为至少 32 字节的完全随机输入来解决此错误,例如head -c 32 /dev/urandom | base64
,或者通过应用程序密钥生成器使用playGenerateSecret
或playUpdateSecret
,如下所述。
此外,如上所述,应用程序密钥用作确保 Play 会话 cookie 有效的密钥,即由服务器生成,而不是由攻击者伪造。但是,密钥只指定一个字符串,并不确定该字符串中的熵量。无论如何,可以通过测量密钥的长度来对密钥中的熵量设置上限:如果密钥长度为 8 个字符,则最多为 64 位熵,这在现代标准中是不够的。
§生成应用程序密钥
Play 提供了一个实用程序,您可以使用它来生成新的密钥。在 Play 控制台中运行playGenerateSecret
。这将生成一个新的密钥,您可以在应用程序中使用它。例如
[my-first-app] $ playGenerateSecret
[info] Generated new secret: QCYtAnfkaZiwrNwnxIlR6CTfG3gf90Latabg5241ABR5W1uDFNIkn
[success] Total time: 0 s, completed 28/03/2014 2:26:09 PM
§在 application.conf 中更新应用程序密钥
Play 还提供了一个方便的工具来更新 application.conf
中的密钥,如果您希望为开发或测试服务器配置特定的密钥。当您使用应用程序密钥对数据进行加密,并且希望确保每次在开发模式下运行应用程序时都使用相同的密钥时,这通常很有用。
要更新 application.conf
中的密钥,请在 Play 控制台中运行 playUpdateSecret
[my-first-app] $ playUpdateSecret
[info] Generated new secret: B4FvQWnTp718vr6AHyvdGlrHBGNcvuM4y3jUeRCgXxIwBZIbt
[info] Updating application secret in /Users/jroper/tmp/my-first-app/conf/application.conf
[info] Replacing old application secret: play.http.secret.key="changeme"
[success] Total time: 0 s, completed 28/03/2014 2:36:54 PM
下一步: 配置会话 cookie
发现此文档中的错误?此页面的源代码可以在 此处 找到。阅读完 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?前往 我们的社区论坛 与社区开始对话。