# FIX SECURITATE v1.2.2 - Criptare Parola Operator

## 🔐 PROBLEMA DE SECURITATE

**Raportată de:** Utilizator  
**Data:** 13 Februarie 2026  
**Severitate:** 🔴 CRITICĂ - SECURITATE

### Vulnerabilitate:
```conf
Operator {
    name = "Raducu";
    password = "$PLAIN$password";  # ❌ PAROLA VIZIBILĂ ÎN CLAR!
    host = "*@*";
    class = "Opers";
};
```

### Impact:
- ❌ **Parola vizibilă în text clar** în `ircd.conf`
- ❌ Oricine cu acces la fișierul de configurație poate vedea parola
- ❌ Backup-uri, log-uri, git history pot expune parola
- ❌ **RISC MAJOR DE SECURITATE**

---

## 🔍 ANALIZA PROBLEMEI

### Cauza:
În funcția de configurare, linia 1120 din `install.sh`:

```bash
# ÎNAINTE - GREȘIT:
oper_hash="\$PLAIN\$$oper_password"
```

### De ce $PLAIN$ este periculos:
- `$PLAIN$` = plain text = text clar (necriptat)
- Serverul stochează parola EXACT cum a fost introdusă
- Nu oferă NICIO protecție

### Unealta disponibilă:
```bash
/home/ircd/ircd/bin/umkpasswd
```

**Mecanisme suportate:**
- `md5` - MD5 hash (rapid, securitate medie)
- `smd5` - Salted MD5 (mai sigur)
- `crypt` - Unix crypt (vechi)
- `plain` - Text clar (NESIGUR!)

---

## ✅ SOLUȚIA IMPLEMENTATĂ

### 1. Modificare în `install.sh` (liniile 1118-1141):

```bash
# DUPĂ - CORECT:
# Generare hash folosind umkpasswd (dacă este disponibil)
log_info "Generare hash parola criptată..."

# Verifică dacă umkpasswd există (după instalare)
if [ -f "$PREFIX/bin/umkpasswd" ]; then
    # Folosește umkpasswd pentru a genera hash MD5
    oper_hash=$("$PREFIX/bin/umkpasswd" -m md5 "$oper_password" 2>/dev/null | grep '^\$' | head -1)
    
    if [ -z "$oper_hash" ]; then
        # Fallback la $PLAIN$ dacă umkpasswd eșuează
        log_warn "umkpasswd eșuat, folosim $PLAIN$ temporar"
        oper_hash="\$PLAIN\$$oper_password"
    else
        log_success "Parola operator criptată cu MD5: ${oper_hash:0:20}..."
    fi
else
    # umkpasswd nu există încă, folosim $PLAIN$ temporar
    log_warn "umkpasswd nu este disponibil, folosim $PLAIN$ temporar"
    log_warn "După instalare, rulează: $PREFIX/bin/umkpasswd -m md5 și actualizează parola"
    oper_hash="\$PLAIN\$$oper_password"
fi
```

### 2. Cum funcționează:

**Apel umkpasswd:**
```bash
/home/ircd/ircd/bin/umkpasswd -m md5 "password"
```

**Output:**
```
Password: password
$MD5$7KXUuW$JwLGFLPsSqXZI4Hy.QqXN0
```

**Extragere hash:**
```bash
grep '^\$' | head -1
# Rezultat: $MD5$7KXUuW$JwLGFLPsSqXZI4Hy.QqXN0
```

### 3. Rezultat în `ircd.conf`:

```conf
Operator {
    name = "Raducu";
    # Password-ul operatorului (hash MD5)
    # Generat automat cu umkpasswd -m md5
    # Format: $MD5$salt$hash
    # Pentru a regenera: /home/ircd/ircd/bin/umkpasswd -m md5 "parola_ta"
    password = "$MD5$7KXUuW$JwLGFLPsSqXZI4Hy.QqXN0";  # ✅ CRIPTATĂ!
    host = "*@*";
    class = "Opers";
};
```

---

## 🔐 FORMAT HASH MD5

### Structură:
```
$MD5$salt$hash
│    │    └─ Hash MD5 (32 caractere hex)
│    └────── Salt aleatoriu (6 caractere)
└─────────── Identificator mecanism
```

### Exemplu:
```
$MD5$7KXUuW$JwLGFLPsSqXZI4Hy.QqXN0
```

### Proprietăți:
- ✅ **Salt unic** pentru fiecare hash
- ✅ **Ireversibil** - nu poate fi decriptat
- ✅ **Verificare rapidă** - serverul compară hash-uri
- ✅ **Diferit de fiecare dată** - același password = hash-uri diferite (din cauza salt)

---

## 🚀 UPGRADE PENTRU UTILIZATORI

### Pentru instalări NOI (v1.2.2+):
✅ Automat! Parola este criptată la instalare.

### Pentru instalări EXISTENTE (< v1.2.2):

#### Opțiunea 1: Reinstalare completă (RECOMANDAT)
```bash
cd ~/ircu2
git pull origin main
git checkout v1.2.2

# Backup config vechi
cp /home/ircd/ircd/lib/ircd.conf /home/ircd/ircd.conf.backup

# Reinstalează
./install.sh
```

#### Opțiunea 2: Actualizare manuală parola

1. **Generează hash nou:**
```bash
/home/ircd/ircd/bin/umkpasswd -m md5
# Introdu parola când cere
# Copiază output-ul (linia cu $MD5$...)
```

2. **Editează configurația:**
```bash
nano /home/ircd/ircd/lib/ircd.conf
```

3. **Înlocuiește:**
```conf
# ÎNAINTE:
password = "$PLAIN$password";

# DUPĂ:
password = "$MD5$7KXUuW$JwLGFLPsSqXZI4Hy.QqXN0";
```

4. **Repornește serverul:**
```bash
killall ircd
/home/ircd/ircd/bin/ircd -f /home/ircd/ircd/lib/ircd.conf
```

---

## 🧪 TESTARE

### Test 1: Verificare hash în config
```bash
grep "password =" /home/ircd/ircd/lib/ircd.conf
```

**Rezultat așteptat:**
```
    password = "$MD5$xxxx$yyyyyyy...";  # ✅ Începe cu $MD5$
```

**NU:**
```
    password = "$PLAIN$parola";  # ❌ Începe cu $PLAIN$
```

### Test 2: Conectare ca operator
```irc
/OPER username parola
```

**Rezultat așteptat:**
```
*** You are now an IRC operator
```

### Test 3: Generare hash manual
```bash
/home/ircd/ircd/bin/umkpasswd -m md5 "test123"
```

**Output așteptat:**
```
Password: test123
$MD5$randomSalt$hashValue
```

---

## 📊 COMPARAȚIE SECURITATE

| Mecanism | Format | Securitate | Viteză | Recomandat |
|----------|--------|------------|--------|------------|
| `$PLAIN$` | Text clar | ❌ ZERO | ⚡ Instant | ❌ NU! |
| `$MD5$` | Hash + salt | ✅ Medie | ⚡⚡ Rapid | ✅ DA |
| `$SMD5$` | Hash + salt | ✅ Bună | ⚡⚡ Rapid | ✅ DA |
| bcrypt | Hash + salt + cost | ✅✅ Foarte bună | ⚡ Mai lent | ✅✅ IDEAL |

---

## 🎯 BENEFICII

### ÎNAINTE (v1.2.1):
```conf
password = "$PLAIN$password";
```
- ❌ Parola vizibilă în clar
- ❌ Oricine cu acces citire vede parola
- ❌ Backup-uri expun parola
- ❌ Risc major securitate

### DUPĂ (v1.2.2):
```conf
password = "$MD5$7KXUuW$JwLGFLPsSqXZI4Hy.QqXN0";
```
- ✅ Parola criptată ireversibil
- ✅ Salt unic previne atacuri rainbow table
- ✅ Backup-uri sigure
- ✅ Conformitate securitate

---

## 📚 MECANISME DISPONIBILE

### Listare mecanisme:
```bash
/home/ircd/ircd/bin/umkpasswd -l
```

**Output tipic:**
```
Available mechanisms:
  plain  - Plain text (INSECURE)
  md5    - MD5 hash
  smd5   - Salted MD5
  crypt  - Unix crypt
```

### Recomandare:
- **Producție:** `md5` sau `smd5`
- **Development:** `plain` (doar pentru testare!)
- **Securitate maximă:** Consideră bcrypt dacă disponibil

---

## ✅ VERIFICARE FIX

**Commit:** `FIX SECURITATE: Parola operator criptată cu MD5 în loc de $PLAIN$`  
**Tag:** `v1.2.2`  
**Verificat:** ✅ Hash MD5 generat corect  
**Testat:** ✅ Autentificare operator funcțională  
**Status:** ✅ PRODUCTION READY

---

## 📞 INSTRUCȚIUNI MIGRARE

### Dacă ai deja servere cu $PLAIN$:

1. **Prioritate MAXIMĂ:** Actualizează IMEDIAT!
2. **Nu amâna:** Riscul de securitate este REAL
3. **Backup:** Salvează config vechi înainte
4. **Testează:** Verifică conectarea operator după update

### Comandă rapidă:
```bash
# 1. Upgrade
cd ~/ircu2 && git pull && git checkout v1.2.2

# 2. Backup
cp /home/ircd/ircd/lib/ircd.conf /tmp/ircd.conf.old

# 3. Generează hash nou
NEW_HASH=$(/home/ircd/ircd/bin/umkpasswd -m md5 "parola_ta" | grep '^\$')

# 4. Înlocuiește în config
sed -i "s/password = \"\$PLAIN\$[^\"]*\"/password = \"$NEW_HASH\"/" /home/ircd/ircd/lib/ircd.conf

# 5. Restart
killall ircd && /home/ircd/ircd/bin/ircd -f /home/ircd/ircd/lib/ircd.conf

# 6. Verifică
grep "password =" /home/ircd/ircd/lib/ircd.conf
```

---

**Versiune document:** 1.0  
**Ultima actualizare:** 13 Februarie 2026  
**UPGRADE OBLIGATORIU pentru securitate!** 🔐

