envied: 導入 使い方 - Ki-Kobayashi/flutter_wiki GitHub Wiki

🟩flutter_dotenvではなく、「envied」を使用する理由

  • 🛑 flutter_dotenv: アセットフォルダに、隠したい情報が暗号化されず、平文保存

    👉 リリース後、逆コンパイルにより、機密情報が漏洩するリスクがある

.

  • 💎 envied(エンビード): 平文保存されることなく、難読化してくれる

    👉 gitignoreに**「envファイル」「env.g.dart」を追加✅
    👉 リリース時は、
「envファイル」を削除📛しておく
       (残しておくと
平文残し**となり、逆コンパイルにより、機密情報が漏洩するリスク)

     📚aarなどに固めたとき、ignoreで除外したファイルも、もろもろすべて組み込まれる(当たり前だが...)

.

🟩 パッケージのインストール

flutter pub add envied
flutter pub add build_runner --dev
flutter pub add envied_generator --dev

.

dependencies:
  flutter:
    sdk: flutter

  envied: ^0.3.0+3 👈追加

dev_dependencies:
  flutter_test:
    sdk: flutter

  build_runner: ^2.4.6  👈追加
  envied_generator: ^0.3.0+3  👈追加

.

🟩 .envの準備

🟡「.env」の作成

配置場所は任意

  • プロジェクトのルートに配置
  • scriptsフォルダー > envフォルダーを作成し、その中に配置
    image

.

💎「.env」の例

# API_KEY名
API_KEY_NAME=xxxx-api-key
# 開発・テスト環境
API_KEY=XXxxxxxxxxxxxxx
# 本番環境環境(仮)
# API_KEY=YYYyyyyYYYyyyyyyy

# (テスト環境)プレフィックス「VITE_」を付けて定義
# PREFIX_APP_BUCKET_URL= https://sample-bucket-dev.s3.ap-northeast-1.amazonaws.com/" 

# (ローカル環境)APIベースURL
# BASE_URL=http://localhost/api/v1/

# (テスト環境)APIベースURL
BASE_URL=https://sample-dev.example.com/api/v1/
# (テスト環境)xx共有用URLのPrefix
PREFIX_DEEP_LINK=https://sample-dev.example.com/xxxx/

.

🟩【.gitignore】に追加

以下を追加しないと、平文の機密情報がGithubなどにあがってしまい、漏洩の原因になる

# (単一のenvファイルがある場合)環境ファイル
.env
env.g.dart

# (複数のenvファイルがある場合)環境ファイル
*.env
*.env.g.dart

.

🟩 【env.dart】を作成

🚨各@EnviedFieldに、【obfuscate: true】をつけること

  👉 開発中でも暗号化して自動生成ファイルを作成してくれる
      ※盗み見する**「ショルダーハッキング」の対策**になる

.

import 'package:envied/envied.dart';

part 'env.g.dart';

// @Envied() 👈「.env」をプロジェクトのルートに配置した場合
@Envied(path: 'scripts/env/.env')  👈「.env」を root/scripts/env 内に配置した場合
abstract class Env {
  @EnviedField(varName: 'API_KEY_NAME', defaultValue: '', obfuscate: true) 👈 【obfuscate: true】開発中でも暗号化して自動生成ファイルを作成してくれる
  static String apiKeyName = _Env.apiKeyName;

  @EnviedField(varName: 'API_KEY', defaultValue: '', obfuscate: true)
  static String apiKey = _Env.apiKey;

  @EnviedField(varName: 'BASE_URL', defaultValue: '', obfuscate: true)
  static String baseUrl = _Env.baseUrl;

  @EnviedField(varName: 'PREFIX_DEEP_LINK', defaultValue: '', obfuscate: true)
  static String prefixDeepLink = _Env.prefixDeepLink;

  @EnviedField(
      varName: 'PREFIX_APP_BUCKET_URL', defaultValue: '', obfuscate: true)
  static String prefixAppBucketUrl = _Env.prefixAppBucketUrl ;
}

.

🟡 env.g.dart を生成する

下記コマンドを実行

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

なんかおかしくなったら・・・・
以下コマンドを順に実行

fvm flutter clean
fvm flutter pub get
fvm flutter pub run build_runner build --delete-conflicting-outputs

env.g.dart が作成されれば成功!

.

🟩 呼び出し方

var dio = Dio()
    ..options = BaseOptions(
      baseUrl: Env.baseUrl, 👈 Env.xxxXxxx 形式で呼ぶ
      contentType: Headers.jsonContentType,
      connectTimeout: const Duration(seconds: 15), 
      receiveTimeout: const Duration(seconds: 15), 
    );

.

🚨 リリース時

「.env」は削除して、aar / apk に固めること。

.

🟡オマケ: envファイルの役割

envファイルで完全にセキュリティOKではない

あくまで難読化が限界値。
  (これ以上難しくするとコンパイル不可能なため、apkなどはコードをユーザーにすべて公開しているという意識が重要)

envファイルとは・・・

  • 情報を一元管理できる
  • 少しでも読み取られにくくする

役割だということ

.

🟩

🟡

.

🟩

🟡

.