[Flutter] Envied Package (Git에 API Key 감추기)

2023. 12. 8. 13:36Flutter

서버 및 다양한 통신을 위하여 API Key를 어떻게 저장하고 있나요?

 

Api 서버의 도메인, 토큰값 등 중요한 데이터를 그대로 넣어서 사용한다면, 쉽게 유출될 수 있기에 보안이 필요합니다.

 

해당 글에서는 보다 안전하게 보관하는 방법에 대해 작성해보겠습니다.

 

 

 

API Key를 감추는 방법은 여러가지 방법이 있지만, 가장 좋은 방법은 Envied의 패키지를 사용하는 것 입니다. (지금까지 찾아본 것 중!)

 

https://pub.dev/packages/envied

 

envied | Dart Package

Explicitly reads environment variables into a dart file from a .env file for more security and faster start up times.

pub.dev

 

 

우선 필요한 패키지를 설치하겠습니다.

(2023-12-08)기준

dependencies:
  ...
  envied: ^0.5.2

dev_dependencies:
  ...
  envied_generator: ^0.5.2
  build_runner: ^2.4.7

 

해당 패키지를 설치한 후 (Pub get)

 

 

root directory 에 .env 파일을 생성합니다.

├── lib
│   ├── main.dart
│ 
├── .env

 

해당 파일에는 보안이 필요한 (API Key 등..) 데이터를 입력합니다.

 

 baseUrl=여기에 데이터를 입력하세요
 baseUrlSaeHa=https://www.naver.com

 

변수명 = 데이터(두번 째 줄 처럼 작성하시면 됩니다)

 

 

 

 

 

이후 env.dart 파일을 생성하겠습니다

 

저는 

├── lib
│   ├── main.dart
│   └── env
│        └── env.dart

 

에 env.dart 파일을 생성하였습니다.

 

 

이후 env.dart 파일에서 다음과 같이 코드를 작성합니다.

 

import 'package:envied/envied.dart';

part 'env.g.dart';

@Envied(path: '.env')
abstract class Env {
  @EnviedField(varName: 'baseUrl', obfuscate: true)
  static final String baseUrl = _Env.baseUrl;
  
  @EnviedField(varName: 'baseUrlSaeHa', obfuscate: true)
  static final String baseUrlSaeHa = _Env.baseUrlSaeHa;
}

 

obfuscate를 ture 를 주게 된다면 난독화를 합니다.

(obfuscate를 true로 주게 된다면 static final String baseUrl = _Env.baseUrl; 부분이 const가 아닌 final로 선언해야 합니다)

 

 

터미널에서 다음 코드를 입력해줍니다.

flutter pub run build_runner build --delete-conflicting-outputs

 

 

 

 

env.g.dart가 생성되었다면 거의 마무리 되었습니다!

 

생성된 env.g.dart의 생김새 (baseUrlSaeHa 만 생성!)

더보기
// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'env.dart';

// **************************************************************************
// EnviedGenerator
// **************************************************************************

// coverage:ignore-file
// ignore_for_file: type=lint
final class _Env {
  static const List<int> _enviedkeybaseUrlSaeHa = <int>[
    1653781031,
    3870634125,
    3538719303,
    1932911704,
    147341041,
    4150891283,
    2760994214,
    1464055502,
    1319218295,
    2707508208,
    690837546,
    546827801,
    180801135,
    1102144468,
    1406832599,
    2926434173,
    1664842566,
    2637705560,
    649027345,
    3448727797,
    239092657,
  ];

  static const List<int> _envieddatabaseUrlSaeHa = <int>[
    1653781071,
    3870634233,
    3538719283,
    1932911656,
    147340930,
    4150891305,
    2760994185,
    1464055521,
    1319218176,
    2707508103,
    690837597,
    546827831,
    180801025,
    1102144437,
    1406832545,
    2926434072,
    1664842548,
    2637705590,
    649027442,
    3448727706,
    239092700,
  ];

  static final String baseUrlSaeHa = String.fromCharCodes(List<int>.generate(
    _envieddatabaseUrlSaeHa.length,
    (int i) => i,
    growable: false,
  ).map((int i) => _envieddatabaseUrlSaeHa[i] ^ _enviedkeybaseUrlSaeHa[i]));
}

 

 

 

마지막으로 Git에 올라가지 않도록  .gitignore에 

 

...

#Envied
*.env
env.g.dart

 

를 추가해 줍니다.

 

 

 

사용 방법

 

 

import 'package:@@@@@/env/env.dart';

String baseUrlSaeha = Env.baseUrlSaeHa;

print(baseUrlSaeha);


-------------------------------------
console
-------------------------------------
http://www.naver.com

 

 

 

 

 

env.g.dart 파일을 보니 복호화하는 과정은 

  static final String baseUrl = String.fromCharCodes(List<int>.generate(
    _envieddata@@@@@.length,
    (int i) => i,
    growable: false,
  ).map((int i) => _envieddata@@@@@[i] ^ _enviedkey@@@@@[i]));

 

로 진행되며, XOR 로 나온 int 값을 String.fromCharCodes 로 변환하여 보여주는 것 같습니다.