ハードコードされた暗号鍵

ソースコードに埋め込まれた暗号鍵

説明

ソースコードに埋め込んだ鍵は、コードとともに漏えいするおそれがあります。ハードコードは鍵の更新を難しくし、複数のシステムで同じ鍵を使い回す原因にもなります。

想定される影響

  • 鍵の漏えい: 漏えいした鍵で、保護されたデータを復号される可能性があります。
  • データの漏えい: 機密情報が漏えいするおそれがあります。
  • 被害の拡大: 複数のシステムで鍵を共用すると、漏えい時の影響範囲が広がります。

対処方法

  • 鍵をソースに埋め込まず、環境変数で渡します。
  • 鍵を安全に保存し、アクセスを制限します。
  • 実績のある暗号ライブラリを使って鍵を扱います。

漏えいした鍵は交換してください。以下の例は、鍵の取得方法に焦点を当てています。CBCには別途認証による保護が必要です。実際の設計では認証付き暗号を優先して検討してください。

例

AES暗号化

変更前

python
# 鍵をハードコードしたAES
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad

cipher = AES.new(b'This is a key123', AES.MODE_CBC) # ハードコードされた鍵
plaintext = b'This is a secret message.'
ciphertext = cipher.encrypt(pad(plaintext, AES.block_size))

変更後

python
# 環境変数で鍵を渡すAES
import os
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad

key = os.environ['ENCRYPTION_KEY'].encode()  # 環境変数から鍵を取得
cipher = AES.new(key, AES.MODE_CBC)
plaintext = b'This is a secret message.'
ciphertext = cipher.encrypt(pad(plaintext, AES.block_size))

解説

  • 変更前: 暗号鍵がソースに埋め込まれ、コードとともに漏えいするおそれがあります。
  • 変更後: 鍵を環境変数から取得し、ソース経由での漏えいリスクを減らします。

RSA暗号化

変更前

python
# 秘密鍵をハードコードしたRSA
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP

# 公開された説明用の鍵です。実際のシステムで使用しないでください。
private_key = RSA.import_key('''-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAsyDriTGA+qrcwgMnd8+ax64xbWYiaxv0pMFuvolq742Zw+x1
dCw27Cotr+VjoymdHNAmxefWNvxOd32CIHmSv5cN6I+UbodLxjp0vLBrsa7krIs7
zD+m4EL6Ebu25YNJkYVFMkqvLBXRZlj41LZY8CQr1LOKXq/NIKhSSmEjKSgtGZnS
zETsi6gKwKp9LEsPGtlylh52+psI6zimj2sVAd/Wz6RoenAZ8K4i43Nto3VmjmtJ
hctt0nwnvIYaLKBOC6rs+XTfZDhaDKbUwoOCzPf8F5O4i5LbdQh8D/n05uk7kanB
yo7CSMW6RKUuR/upxanu7iRrfSNC5dWbknQuDQIDAQABAoIBAFBO5ApgHVlEnTCG
RX2bn+MCH7rSXX/zypzK9CGMblrz+woxyv7Ii98Zkd4YU7FlCMFQOPHlXM7OE0fT
BzIUD0zCJkQrivp6wegfcRLfbYj9xhvtWGPb7a8BmCe3JuqDD8qkGz/O5/Y12emu
3fBPyFPxg40a6WBGJQsNK8eZATCDx//RsksJUmEuKlZ4qiDKO7P7+x1tfN9oWl8x
qkINbCRplM139lUnFTUJmLDGricM45y98Dd8kfgtBa66cznAibpVScWJYJbwgyT3
H1k70uST3vaSdvP+tWsb4AR/IdxhpUXGvh64OfpjfVMg+Rol7jPfkiV10hJBrS13
bX0vyakCgYEAxX+NcZp5by1MKgP/FHH/Nn+uLB4DBTMN2Eq9/LAA3rd6uW0659ed
HdTiD7l6L1uij0W7I7jB9Q5DFWKaAbLzdkkezH9yK3gV4m+RfWpRNjiQ+d4j39pb
Wz1lmMOYeQKORA/+avSCSmuSEcsLZpp9t5NA/ZIqfkY8ZnMH6B+nNXMCgYEA6DBh
yB8Q0GFDpJztwrxiWxHo+oQXPgR+5yEmVAlYACaNiBt3N9tbpqKB+8IR7WSi8xS/
BVMV5qVjas5TB3vJJYXhQAtvVUfw0iTy3txOs6qPpjaREFiBfsXIiO0AElB34QPb
J/LMSJU9Egi7djP9z/UOZieCCtZdsQOJGvgCLn8CgYEAxRUXGdGT8pzaT2czibyE
eGcLcNz2GJ8s5rUXR+x+wcGIxzc4PBlOoXFJsXVed5nS63QjXm9Fpfx4dwOxOZbR
Gy22fU2EqdooxJCfN+77Yccq7R1+4SiuV6s6EirFoaQqQcNQGH0s84TK+9SJ6Pas
E5/vj9rnaqE+LuIFdt73Zf8CgYEAjhY1cEqadnpe85hY40d3BPYD1XIJ6xjDM9uU
Ye7J3GW7TKRKI3NoNaPS2Waco+Jm2UxDzRVYHKnvGcgjBTxaDk1MV23n9o8srtyP
h5PX0Zi5iWRxB0iyDgsouaoW1h5KDffXIC4zluNE2Qlg9mfAlYcIBbl9mfYupYld
WJSWeS8CgYBx+B5Nm9LGajLalADzuoBie7q+SpIxuOMekX3P5kUWva6RkLrx7SQK
+9T251RMzP3As3OnGCToiXn4mpGFSIy4yK4SxN4NCd+ZZJHs/hSzQLn5K3rkNJP/
bpfhw/iskUP1xeLZjp+yBRCmTGWN+HKf2B3/wCa2fQjIh+TeLB5SHg==
-----END RSA PRIVATE KEY-----''')
cipher = PKCS1_OAEP.new(private_key)
ciphertext = cipher.encrypt(b'This is a secret message.')

変更後

python
# 環境変数で秘密鍵を渡すRSA
import os
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP

private_key = RSA.import_key(os.environ['PRIVATE_KEY'])  # 環境変数から鍵を取得
cipher = PKCS1_OAEP.new(private_key)
ciphertext = cipher.encrypt(b'This is a secret message.')

解説

  • 変更前: RSA秘密鍵がソースに埋め込まれています。
  • 変更後: 秘密鍵をソースに保存せず、環境変数から取得します。

参考資料