dotenvxを使用して.envを暗号化する方法

dotenvxとは

dotenvxは.envを暗号化するツールです。

.envファイルにはパスワードなど、第三者に見られては困る内容が書かれていることが多いため、暗号化して、のぞき見されてもわからないようにしたほうがセキュリティが向上します。

また、暗号化すれば.envファイルをGitHubにプッシュできるので、.envファイルが存在することがGitHubのファイル一覧からわかるようになります。

Macの場合はHomebrewでインストールできます。

ShellScript
brew install dotenvx/brew/dotenvx

Curl, Npm, Docker, Windowsなどでインストールする方法も公式ドキュメントに書かれています。

Documentation | Dotenv

インストールしたらまず.envファイルを用意します。

.env
PASSWORD=ABCD1234

.envをsourceコマンドで読み込めばechoコマンドで表示できます。

ShellScript
source ./.env
echo $PASSWORD
ABCD1234

.envファイルを暗号化する

.envファイルを暗号化するには「dotenvx encrypt」コマンドを実行します。

ShellScript
dotenvx encrypt
 encrypted (.env)
 key added to .env.keys (DOTENV_PRIVATE_KEY)
 add .env.keys to .gitignore: [echo ".env.keys" >> .gitignore]
 run [DOTENV_PRIVATE_KEY='f2eae50a95c71c852847f9e95e7e8cbae785f3821b6e9bbe5cdb9cba170da3c7' dotenvx run -- yourcommand] to test decryption locally

実行後は.envが暗号化され、解読するための.env.keysが生成されます。

※ .env.productionファイルの場合は「dotenvx encrypt -f .env.production」で暗号化します。

.envが暗号化され、解読するための.env.keysが生成されます

暗号化は現在の技術で解読するには数十億年かかるSecp256k1が使用されているので、.env.keysなしで解読されることはないです。

.env
#/-------------------[DOTENV_PUBLIC_KEY]--------------------/
#/            public-key encryption for .env files          /
#/       [how it works](https://dotenvx.com/encryption)     /
#/----------------------------------------------------------/
DOTENV_PUBLIC_KEY="0283a6db45e326311c7aa3717091de3acxb6cd04341e912591dcf04f36908963d6"

# .env
PASSWORD="encrypted:ABMNXG3OGZO6l2Di49jDoTGs2NXBUIs7v2bcdKq+emcufAWD9iwhrSAwJB7LNjulCmTPe92n86gbMtdJ0+z028AYPn4iQE52DNqJqzGfVYAB1dGPmlXhalqwJab/5lWvjCmwlt7ayd+h"
.env.keys
#/------------------!DOTENV_PRIVATE_KEYS!-------------------/
#/ private decryption keys. DO NOT commit to source control /
#/     [how it works](https://dotenvx.com/encryption)       /
#/----------------------------------------------------------/

# .env
DOTENV_PRIVATE_KEY="bx7b1c4d98447e4e31ab7237dcace1234cx2075db81986ee00fab3baf452c27a"

.env.keysを生成したら「echo ".env.keys" >> .gitignore」コマンドで.gitignoreを追加してGitHubに反映させないようにします。

暗号化後は.envを読み込んで、echoで実行すると「encrypted:BDMN〜」が表示されます。

ShellScript
source ./.env
echo $PASSWORD
encrypted:BDMNMG3OGZO6l2Di49jDoTGs2NYBUIs7v2bcyKq+emcufAWD9iwhrSAwJB7LNjulCmTPe92n86gbMtdJ0+z037AYPn5iQE52DNqJqzGfVYGR1dGPmlXhalqwJfg/5lWvjCmwlt7ayd+h

dotenvx getを実行すると解読して表示できます。

ShellScript
dotenvx get PASSWORD
ABCD1234

ほかのキーを追加する場合は「dotenvx set API_KEY foobar」のように実行します。

ShellScript
dotenvx set API_KEY foobar
.env
#/-------------------[DOTENV_PUBLIC_KEY]--------------------/
#/            public-key encryption for .env files          /
#/       [how it works](https://dotenvx.com/encryption)     /
#/----------------------------------------------------------/
DOTENV_PUBLIC_KEY="0283a6db45e326311c7aa3717091de3acxb6cd04341e912591dcf04f36908963d6"

# .env
PASSWORD="encrypted:ABMNXG3OGZO6l2Di49jDoTGs2NXBUIs7v2bcdKq+emcufAWD9iwhrSAwJB7LNjulCmTPe92n86gbMtdJ0+z028AYPn4iQE52DNqJqzGfVYAB1dGPmlXhalqwJab/5lWvjCmwlt7ayd+h"
API_KEY="encrypted:AOKuG6zfKK/mtUWNozx14hlRlxFFbXUgXKRuBzRNqBYsvZk/AdF1Y/abcim32RKZU/K+rKXElMNd7hXMFNXdab71TQOx/AUOcoAb0Je+gFbxgPEjmNhBZlBAdjJ8BdukeEQrorNStw=="

.envを確認すると暗号化して追加されていることが確認できます。

dotenvx decryptで複号できる

暗号化した.envファイルを元に戻す(復号)するにはdotenvx decryptを実行します。

ShellScript
dotenvx decrypt
.env
#/-------------------[DOTENV_PUBLIC_KEY]--------------------/
#/            public-key encryption for .env files          /
#/       [how it works](https://dotenvx.com/encryption)     /
#/----------------------------------------------------------/
DOTENV_PUBLIC_KEY="0283a6db45e326311c7aa3717091de3acxb6cd04341e912591dcf04f36908963d6"

# .env
PASSWORD="ABCD7890"
API_KEY="foobar"

Next.jsなどで使用する場合

package.jsonの「next dev」などを「dotenvx run -- next dev」に変えて実行するだけで暗号化した.envを解読して表示できます。

page.tsx
export default function Home() {
  return (
    // ABCD1234 が表示されます。
    <h1>{process.env.PASSWORD}</h1>
  );
}