0Pricing
C# Academy · บทเรียน

การจัดการข้อมูลลับ

จัดเก็บข้อมูลลับอย่างปลอดภัยด้วย .NET User Secrets ระหว่างการพัฒนา และใช้ Azure Key Vault หรือตัวแปรสภาพแวดล้อมในระบบจริง

การจัดการข้อมูลลับ เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

ข้อมูลลับไม่ใช่การกำหนดค่า

รหัสผ่าน คีย์ API สตริงการเชื่อมต่อ และคีย์สำหรับลงนาม JWT ต้องไม่จัดเก็บไว้ใน appsettings.json หรือส่งเข้าไปในระบบควบคุมซอร์สโค้ดโดยเด็ดขาด .NET มีกลไกเฉพาะสำหรับจัดการข้อมูลลับหลายรูปแบบ

ข้อมูลลับของผู้ใช้ (การพัฒนา)

ข้อมูลลับของผู้ใช้สำหรับการพัฒนาจะถูกจัดเก็บไว้นอกไดเรกทอรีโครงการในไฟล์เฉพาะเครื่อง ข้อมูลเหล่านี้จะถูกโหลดโดยอัตโนมัติในสภาพแวดล้อม Development และจะไม่เดินทางไปพร้อมกับซอร์สโค้ด

# Initialize (adds UserSecretsId to .csproj):
dotnet user-secrets init

# Set secrets:
dotnet user-secrets set "Database:Password" "dev-pass-123"
dotnet user-secrets set "Jwt:SigningKey" "dev-jwt-key-abc"
dotnet user-secrets set "OpenAI:ApiKey" "sk-..."

# List / remove:
dotnet user-secrets list
dotnet user-secrets remove "OpenAI:ApiKey"

# Stored at:
# macOS/Linux: ~/.microsoft/usersecrets/{id}/secrets.json
# Windows:     %APPDATA%\Microsoft\UserSecrets\{id}\secrets.json

การโหลดข้อมูลลับของผู้ใช้อย่างชัดเจน

Host.CreateApplicationBuilder จะโหลดข้อมูลลับของผู้ใช้โดยอัตโนมัติใน Development นอกจากนี้ คุณยังสามารถโหลดข้อมูลเหล่านี้อย่างชัดเจนสำหรับสถานการณ์ที่ไม่ใช่ Development หรือโครงการทดสอบได้

var builder = Host.CreateApplicationBuilder(args);

// Automatic (Development only) — already done by default
// Equivalent manual call:
if (builder.Environment.IsDevelopment())
    builder.Configuration.AddUserSecrets<Program>();

// In test projects (no ASPNETCORE_ENVIRONMENT):
var config = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json", optional: true)
    .AddUserSecrets<Program>()   // loads secrets.json
    .AddEnvironmentVariables()
    .Build();

ตัวแปรสภาพแวดล้อมสำหรับการใช้งานจริง

ในการใช้งานจริง ให้ส่งข้อมูลลับเข้าไปเป็นตัวแปรสภาพแวดล้อม โดยข้อมูลเหล่านี้จะถูกอ่านจาก OS หรือตัวจัดการประสานงานคอนเทนเนอร์ขณะทำงาน และจะไม่ถูกบันทึกลงดิสก์เป็นข้อความธรรมดาร่วมกับโค้ด

# docker-compose.yml — inject secrets:
services:
  api:
    image: myapp:latest
    environment:
      - Database__Password=${DB_PASSWORD}     # from .env file
      - Jwt__SigningKey=${JWT_KEY}
      - ConnectionStrings__Default=Server=db;Password=${DB_PASSWORD}

# Kubernetes Secret:
kubectl create secret generic app-secrets \
  --from-literal=Database__Password=secret123 \
  --from-literal=Jwt__SigningKey=verylongkey

# Reference in pod spec:
# env:
#   - name: Database__Password
#     valueFrom:
#       secretKeyRef: { name: app-secrets, key: Database__Password }

การผสานรวม Azure Key Vault

Azure Key Vault คือที่เก็บข้อมูลลับที่มีการจัดการสำหรับการใช้งานจริง ผู้ให้บริการอย่างเป็นทางการจะโหลดข้อมูลลับเข้าสู่ระบบการกำหนดค่าโดยตรง ทำให้ app ของคุณอ่านข้อมูลเหล่านี้ได้เช่นเดียวกับค่าการกำหนดค่าอื่น ๆ

// dotnet add package Azure.Extensions.AspNetCore.Configuration.Secrets
// dotnet add package Azure.Identity

var builder = WebApplication.CreateBuilder(args);

if (!builder.Environment.IsDevelopment())
{
    var kvUri = new Uri(builder.Configuration["Azure:KeyVaultUri"]!);

    // Uses Managed Identity / workload identity in production:
    builder.Configuration.AddAzureKeyVault(kvUri, new DefaultAzureCredential());
}

// Secrets named "Database--Password" in Key Vault
// are accessible as builder.Configuration["Database:Password"]
// (Key Vault uses -- as the : separator)

AWS Secrets Manager

บน AWS ให้ใช้ Amazon.Extensions.Configuration.SystemsManager หรือใช้ Secrets Manager โดยตรงเพื่อฉีดข้อมูลลับเข้าสู่กระบวนการกำหนดค่าของ .NET

// dotnet add package Amazon.Extensions.Configuration.SystemsManager

builder.Configuration.AddSystemsManager(
    path: "/myapp/production",     // parameter store prefix
    optional: false,
    reloadAfter: TimeSpan.FromMinutes(30));

// Or Secrets Manager directly:
using Amazon.SecretsManager;
using Amazon.SecretsManager.Model;

var client = new AmazonSecretsManagerClient();
var response = await client.GetSecretValueAsync(new GetSecretValueRequest
{
    SecretId = "myapp/production/db-password"
});
var secret = response.SecretString; // JSON string
// Parse and inject into config

HashiCorp Vault

HashiCorp Vault มีข้อมูลลับแบบไดนามิก การหมุนเวียนข้อมูลลับ และการควบคุมการเข้าถึงแบบละเอียด ใช้ไลบรารีชุมชน VaultSharp หรือผู้ให้บริการการกำหนดค่าเพื่อผสานรวมกับ .NET

// dotnet add package VaultSharp

using VaultSharp;
using VaultSharp.V1.AuthMethods.Token;

var authMethod = new TokenAuthMethodInfo("vault-token");
var vaultClient = new VaultClient(
    new VaultClientSettings("https://vault.example.com:8200", authMethod));

// Read a secret:
var kv = await vaultClient.V1.Secrets.KeyValue.V2
    .ReadSecretAsync(path: "myapp/database", mountPoint: "secret");

var password = kv.Data.Data["password"].ToString();

// Then store in configuration or pass to IOptions:
builder.Configuration["Database:Password"] = password;

การปกป้องข้อมูลลับในหน่วยความจำ

แม้จะอยู่ในหน่วยความจำ ก็ควรจัดการข้อมูลลับอย่างระมัดระวัง ใช้ SecureString หรือจำกัดขอบเขตด้วยบล็อก using และหลีกเลี่ยงการบันทึกค่าข้อมูลลับ

// NEVER log secrets:
_logger.LogInformation("API Key: {Key}", apiKey); // WRONG!
_logger.LogInformation("API Key configured: {HasKey}", !string.IsNullOrEmpty(apiKey)); // CORRECT

// Mask in diagnostics:
public string KeyHint => apiKey.Length > 8
    ? $"{apiKey[..4]}...{apiKey[^4..]}"
    : "****";

// Scope the secret:
void ProcessWithSecret()
{
    var secret = LoadSecret();
    try   { UseSecret(secret); }
    finally { secret = string.Empty; } // clear reference
}

ข้อมูลลับใน CI/CD

กระบวนการ CI/CD (GitHub Actions, Azure DevOps, Jenkins) มีที่เก็บตัวแปรลับ ให้ฉีดข้อมูลลับเข้าไปเป็นตัวแปรสภาพแวดล้อมในเวลาสร้างหรือนำระบบไปใช้งาน ห้ามฝังข้อมูลเหล่านี้ไว้ใน YAML ของกระบวนการโดยเด็ดขาด

# GitHub Actions — store in Settings > Secrets:
# name: Deploy
# on: push
# jobs:
#   deploy:
#     runs-on: ubuntu-latest
#     env:
#       Database__Password: ${{ secrets.DB_PASSWORD }}
#       Jwt__SigningKey: ${{ secrets.JWT_KEY }}
#     steps:
#       - name: Run migration
#         run: dotnet ef database update

# Azure Pipelines:
# variables:
#   - group: my-app-secrets  # from Azure DevOps Variable Group

# The secrets are masked in logs and never stored in plaintext

กรณีใช้งานจริง: กลยุทธ์ข้อมูลลับสำหรับการพัฒนาและการใช้งานจริง

กลยุทธ์ข้อมูลลับแบบครบถ้วน: ใช้ข้อมูลลับของผู้ใช้ในการพัฒนา ใช้ Azure Key Vault ในการใช้งานจริง และใช้ตัวแปรสภาพแวดล้อมเป็นค่าทางเลือกสำรอง

var builder = WebApplication.CreateBuilder(args);

if (builder.Environment.IsDevelopment())
{
    // Dev: local secrets.json, never committed
    builder.Configuration.AddUserSecrets<Program>();
}
else
{
    // Production: Azure Key Vault via Managed Identity
    var kvUri = builder.Configuration["Azure:KeyVaultUri"];
    if (!string.IsNullOrEmpty(kvUri))
        builder.Configuration.AddAzureKeyVault(
            new Uri(kvUri), new DefaultAzureCredential());
}

// Always load env vars (works in all environments + containers):
// Already loaded by CreateBuilder — they override Key Vault

// Bind secrets to strongly typed options:
builder.Services
    .AddOptions<JwtOptions>()
    .BindConfiguration("Jwt")
    .ValidateDataAnnotations()
    .ValidateOnStart();

ตรวจสอบความเข้าใจ

เหตุใดจึงไม่ควรจัดเก็บข้อมูลลับไว้ใน appsettings.json

สรุปทบทวน: การจัดการข้อมูลลับ

ประเด็นสำคัญ:

  • อย่าจัดเก็บข้อมูลลับไว้ใน appsettings.json เพราะไฟล์นี้จะถูกส่งเข้าไปในระบบควบคุมซอร์สโค้ด
  • การพัฒนา: ใช้ข้อมูลลับของผู้ใช้ (dotnet user-secrets) ซึ่งจัดเก็บไว้นอกโครงการ
  • การใช้งานจริง: ใช้ตัวแปรสภาพแวดล้อม Azure Key Vault AWS Secrets Manager หรือ HashiCorp Vault
  • CI/CD: จัดเก็บข้อมูลลับในที่เก็บข้อมูลลับของกระบวนการ และฉีดเข้าไปเป็นตัวแปรสภาพแวดล้อม
  • อย่าบันทึกค่าข้อมูลลับดิบ ให้ใช้คำใบ้หรือการปกปิดแทน
  • ผสานกลยุทธ์เข้าด้วยกัน: ข้อมูลลับของผู้ใช้ในการพัฒนา + Key Vault ในการใช้งานจริง + ตัวแปรสภาพแวดล้อมเป็นค่าที่เขียนทับ

คำถามที่พบบ่อย

บทเรียน “การจัดการข้อมูลลับ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การจัดการข้อมูลลับ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การจัดการข้อมูลลับ”

จัดเก็บข้อมูลลับอย่างปลอดภัยด้วย .NET User Secrets ระหว่างการพัฒนา และใช้ Azure Key Vault หรือตัวแปรสภาพแวดล้อมในระบบจริง คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การจัดการข้อมูลลับ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แหล่งและผู้ให้บริการการกำหนดค่า
  2. Options แบบระบุชนิดอย่างเคร่งครัดด้วย IOptions
  3. การตรวจสอบ Options และ Named Options
  4. การจัดการข้อมูลลับ
← กลับไปที่ C# Academy