§應用程式密碼
Play 使用密鑰來執行多項工作,包括
- 簽署階段快取和 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 有效的關鍵,亦即由伺服器產生,而非攻擊者偽造。但是,機密只指定字串,且不決定該字串中的熵量。無論如何,只要測量機密的長度,就可以對機密中的熵量設定上限:如果機密長度為八個字元,則最多只有 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
在此文件檔中發現錯誤?此頁面的原始程式碼可以在 這裡 找到。在閱讀 文件檔指南 後,請隨時提交拉取請求。有問題或建議要分享嗎?前往 我們的社群論壇 與社群展開對話。