티스토리 뷰

프라이빗 키를 .env 파일에 저장하는 것은 안전하지 않다

 제목 어그로를 좀 끌어봤는데 사실 .env 파일 사용하지 마라는 것은 아닙니다. 다만 프라이빗 키를 .env 파일에 저장해서 사용하는 것은 지양해야 합니다.

 

 왜냐? 프라이빗 키가 플레인 텍스트로 저장되기 때문입니다. 자금이 들어있는 프라이빗 키를 사용했는데 .env 파일이 노출되기라도 하면 그야말로 대환장 파티. 게다가 코파일럿이나 이와 관련된 여러 AI 도구들이 코드를 읽어들이면서 .env 파일에도 접근해 프라이빗 키를 기억하고 저장했다가 언제 어디서 어떻게 노출시켜버릴 지도 미지수입니다.

RPC_URL=https://ethereum-sepolia.publicnode.com
PRIVATE_KEY=<PRIVATE_KEY>

 또한 --private-key 플래그를 사용해 프라이빗 키를 전달하는 것도 명령어 히스토리로 남기 때문에 가능하면 다른 방식을 사용하는 것이 좋습니다.


ERC-2335 Keystore

 .env 파일 대신 프라이빗 키를 저장하고 불러오기 위한 방안으로 ERC-2335 Keystore 파일을 사용할 수 있습니다. 

 

ERC-2335: BLS12-381 Keystore

 

eips.ethereum.org

 foundry를 설치할 때 함께 설치되는 cast cli를 사용해 keystore 파일을 생성할 수 있습니다.

  • --interactive : 프라이빗 키와 암호화에 사용할 비밀번호를 입력하기 위한 프롬프트를 실행합니다.
  • piatoss : keystore의 계정 이름을 명시해 줍니다.
$ cast wallet import --interactive piatoss
Enter private key: 
Enter password: 
`piatoss` keystore was saved successfully. Address: 0x965b0e63e00e7805569ee3b428cf96330dfc57ef

 생성된 계정은 list 또는 ls 명령어로 확인할 수 있습니다.

$ cast wallet ls
piatoss

 생성된 keystore 파일은 루트 디렉토리의 .foundry/keystores 디렉토리에 저장됩니다.

$ ls ~/.foundry/keystores/
piatoss

 keystore 파일에는 암호화된 프라이빗 키가 json 형식으로 저장되어 있습니다.

$ cat ~/.foundry/keystores/piatoss 
{"crypto":{"cipher":"aes-128-ctr","cipherparams":{"iv":"cb51baa23cb8c7169129562c785e6622"},"ciphertext":"213b14ee3e1af0e7682329930432d62e0d65cbb6368296dc286b6dd5bf99a51d","kdf":"scrypt","kdfparams":{"dklen":32,"n":8192,"p":1,"r":8,"salt":"03b6a8da4bf53aada5e9ea397884088427c14c63a502c9fbb2fb878a6b578c01"},"mac":"bcb9430319b27d93d67f23bde092da1b150d331a3b009d6aea5161ef32656d8f"},"id":"76f71749-05aa-445d-aea8-ca0202cf0fd3","version":3}

Keystore 파일을 사용해 배포하기

 forge init 명령어를 실행하면 기본으로 생성되는 Counter 컨트랙트를 스크립트로 배포해 보겠습니다.

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {Script, console} from "forge-std/Script.sol";
import {Counter} from "../src/Counter.sol";

contract CounterScript is Script {
    function setUp() public {}

    function run() public {
        vm.startBroadcast();

        Counter counter = new Counter();

        vm.stopBroadcast();
    }
}

 스크립트는 다음과 같이 실행됩니다.

  • --rpc-url : 스크립트를 실행할 블록체인 노드의 RPC URL. .env 파일에 저장된 Sepolia 네트워크의 RPC URL을 사용.
  • --account : 사용할 keystore 파일의 계정 이름
  • --sender : 프라이빗 키에서 파생되는 이더리움 주소. 명시하지 않을 경우 foundry의 default sender가 사용되므로 오류가 발생합니다.
  • --broadcast  : RPC URL을 사용해 해당 블록체인 네트워크로 트랜잭션을 브로드캐스팅합니다.
  • --vvvv  : 로그 트레이싱 레벨.
$ forge script script/Counter.s.sol --rpc-url "$RPC_URL" --account piatoss --sender 0x965b0e63e00e7805569ee3b428cf96330dfc57ef --broadcast -vvvv

 

 명령어를 실행하면 스크립트가 정상적으로 실행되는지 테스트를 해보고 트랜잭션을 브로드캐스팅하기 위해 keystore 파일을 복호화하고자 다음과 같이 비밀번호를 물어봅니다.

###
Finding wallets for all the necessary addresses...
Enter keystore password:

 keystore 파일을 생성할 때 입력한 비밀번호와 일치하는 비밀번호를 입력한다면 트랜잭션이 정상적으로 브로드캐스팅되고 다음과 같이 생성된 컨트랙트의 주소가 출력됩니다.

##
Waiting for receipts.
⠉ [00:00:13] [######################################################################################################################################################################] 1/1 receipts (0.0s)
##### sepolia
✅  [Success]Hash: 0x9b30acdc3407a93ce0e91e08bc5fe65539364d714eb00e34a3f83a10d29ccfb2
Contract Address: 0xAAFDe81ee76CDdB2e713d86E75E420FE7A439b83
Block: 5346037
Paid: 0.000320192417413275 ETH (106725 gas * 3.000163199 gwei)

 생성된 컨트랙트는 Sepolia Etherscan에서 확인할 수 있습니다.

 

Contract Address 0xAAFDe81ee76CDdB2e713d86E75E420FE7A439b83 | Etherscan

The Contract Address 0xAAFDe81ee76CDdB2e713d86E75E420FE7A439b83 page allows users to view the source code, transactions, balances, and analytics for the contract address. Users can also interact and make transactions to the contract directly on Etherscan.

sepolia.etherscan.io


참고

 

최근에 올라온 글
최근에 달린 댓글
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday
글 보관함