v3.1.0Sicherheit

Verschlüsselung & Hashing

Sichere Passwort-Speicherung mit Argon2id und Datenverschlüsselung mit AES-256-GCM.

Passwörter hashen

use security

// Passwort hashen (beim Registrieren)
let hash = security.hashPassword("GeheimesPasswort123");
// hash ist z.B. "$argon2id$v=19$m=4096,t=3,p=1$..."

// Passwort verifizieren (beim Login)
let isValid = security.verifyPassword("Eingabe123", hash);

if (!isValid) {
    throw HttpError.Unauthorized("Falsches Passwort");
}

Vollständiges Login-Beispiel

use security

@POST("/register")
fn register(email: string, password: string): User {
    // Prüfen ob Email bereits existiert
    if (db.findBy(User, "email", email) != null) {
        throw HttpError.BadRequest("Email bereits registriert");
    }
    
    let user = User {
        id: utils.uuid(),
        email: email,
        passwordHash: security.hashPassword(password),
        createdAt: datetime.now(),
    };
    
    return db.save(user);
}

@POST("/login")
fn login(email: string, password: string): LoginResponse {
    let user = db.findBy(User, "email", email);
    
    if (!user || !security.verifyPassword(password, user.passwordHash)) {
        throw HttpError.Unauthorized("Falsche Zugangsdaten");
    }
    
    let token = auth.createToken({
        sub: user.id,
        exp: datetime.now().addHours(24)
    });
    
    return LoginResponse { token, user };
}

Daten verschlüsseln

Für sensible Daten in der Datenbank (API-Keys, Gesundheitsdaten, etc.) bietet VelinScript AES-256-GCM Verschlüsselung:

use encryption

let secretKey = config.get("ENCRYPTION_KEY");

// Verschlüsseln (AES-256-GCM)
let encrypted = encryption.aes_encrypt("Sensible Daten", secretKey);

// Entschlüsseln
let plain = encryption.aes_decrypt(encrypted, secretKey);

log.info(plain); // "Sensible Daten"

Praktisches Beispiel: API Keys speichern

use encryption

struct UserApiKey {
    id: string,
    userId: string,
    encryptedKey: string,  // Verschlüsselt gespeichert
    name: string,
    createdAt: string,
}

@Auth
@POST("/api/keys")
fn createApiKey(name: string): ApiKeyResponse {
    let user = currentUser();
    let masterKey = config.get("ENCRYPTION_KEY");
    
    // Generiere neuen API Key
    let rawKey = utils.generateSecureKey(32);
    
    // Verschlüsseln vor dem Speichern
    let encrypted = encryption.aes_encrypt(rawKey, masterKey);
    
    let apiKey = UserApiKey {
        id: utils.uuid(),
        userId: user.id,
        encryptedKey: encrypted,
        name: name,
        createdAt: datetime.now(),
    };
    
    db.save(apiKey);
    
    // Key nur EINMAL im Klartext zurückgeben
    return ApiKeyResponse { 
        id: apiKey.id, 
        key: rawKey,  // Nur bei Erstellung!
        name: name 
    };
}

Hashing vs Verschlüsselung

Hashing (Einweg)

Nicht umkehrbar. Ideal für Passwörter.

  • Passwörter
  • Integritätsprüfung
  • Digitale Signaturen
Verschlüsselung (Zweiweg)

Umkehrbar mit Schlüssel. Für sensible Daten.

  • API Keys von Nutzern
  • Gesundheitsdaten
  • Zahlungsinformationen

Weitere Encryption-Funktionen

use encryption

// RSA Schlüsselpaar generieren
let keypair = encryption.rsa_generate_keypair(2048);

// Asymmetrische Verschlüsselung
let rsaEncrypted = encryption.rsa_encrypt("data", keypair.public_key);
let rsaDecrypted = encryption.rsa_decrypt(rsaEncrypted, keypair.private_key);

// Fernet (Symmetrische Verschlüsselung mit Zeitstempel)
let fernetKey = encryption.fernet_generate_key();
let fernetEncrypted = encryption.fernet_encrypt("secret", fernetKey);
let fernetDecrypted = encryption.fernet_decrypt(fernetEncrypted, fernetKey);

// Schlüsselverwaltung
encryption.store_key("user_key_1", secretKey, "main_vault");
let retrievedKey = encryption.retrieve_key("user_key_1");

// Hashing (für Checksums, nicht Passwörter!)
let shaHash = encryption.sha256("data");

// HMAC für Message Authentication
let hmac = encryption.hmac("message", secretKey);

// Sichere Zufallszahlen
let randomBytes = encryption.random_bytes(32);
let randomInt = encryption.random_int(1, 100);

Best Practices

Argon2id für Passwörter

Nicht bcrypt, nicht SHA-256, immer Argon2id

Keys in Env Vars

Encryption Keys niemals im Code speichern

Key Rotation

Regelmäßig Encryption Keys rotieren

Unique Salts

VelinScript generiert automatisch einzigartige Salts