~~NOTOC~~
{{wvds:title>Varnost}}
===== Varnostni Mehanizmi =====
WvdS Crypto Service implementira več zaščitnih mehanizmov, ki so **samodejno aktivni**. Ničesar vam ni treba konfigurirati.
----
==== Omejevanje Hitrosti ====
Ščiti pred napadi zavrnitve storitve (DoS) z obremenitvijo.
| Parameter | Vrednost |
| Maks. zahtev/sekundo | 1000 |
| Burst toleranca | 100 |
| Cooldown | 100 ms |
**Obnašanje ob prekoračitvi:**
Zahteva --> [Rate Limiter] --> Status: 0x07 (RATE_LIMITED)
--> Kriptografska operacija ni izvedena
**Priporočilo za odjemalce:**
* Pri statusu 0x07: Počakajte in ponovite z backoff
* Eksponentna čakalna doba: 100ms, 200ms, 400ms, ...
int send_with_retry(const uint8_t* request, size_t len) {
int retry = 0;
int delay_ms = 100;
while (retry < 5) {
send_request(request, len);
int status = get_response_status();
if (status != 0x07) return status; // Ni rate-limited
usleep(delay_ms * 1000);
delay_ms *= 2; // Eksponentni backoff
retry++;
}
return -1; // Timeout
}
----
==== Sledenje Nonce ====
**Ponovna uporaba Nonce = Katastrofa**
Pri AES-GCM ponovna uporaba nonce vodi do popolnega kompromitiranja obeh čistopisov!
Crypto Service aktivno ščiti pred ponovno uporabo nonce:
=== Za Encrypt ===
* Nonce generira storitev (CSPRNG)
* Odjemalec ne more predložiti lastne nonce
* Vsaka nonce se uporabi samo enkrat
=== Za Decrypt ===
* Storitev shranjuje uporabljene nonce (Bloom Filter)
* Pri ponovljeni nonce: Status 0x08 (NONCE_REUSE)
* Velikost okna: 1 milijon nonce
**Opomba:** Sledenje nonce je na ključ-ID. Pri rotaciji ključa se sledilnik ponastavi.
----
==== Validacija Vhodov ====
Vsi vnosi se preverijo pred obdelavo:
| Preverjanje | Koda napake |
| Magic Byte != 0xC7 | 0x01 (INVALID_HEADER) |
| Neznan Request-Type | 0x02 (INVALID_TYPE) |
| Dolžina vsebine napačna | 0x03 (INVALID_PAYLOAD) |
| Key-ID ne obstaja | 0x04 (KEY_NOT_FOUND) |
| Vsebina > 64 KB | 0x09 (PAYLOAD_TOO_LARGE) |
**Brez izjem:**
Storitev ne vrže izjem. Vse napake se sporočijo preko statusnih kod.
----
==== Maksimalna Velikost Vsebine ====
| Omejitev | 64 KB (65536 bajtov) |
Razlogi:
* Velikost skupnega pomnilnika omejena
* Zaščita pred DoS (izčrpanje pomnilnika)
* Predvidljiv čas izvajanja
**Šifriranje velikih podatkov:**
// Chunked Encryption za velike datoteke
#define CHUNK_SIZE (60 * 1024) // 60 KB na kos
int encrypt_large_file(FILE* in, FILE* out) {
uint8_t buffer[CHUNK_SIZE];
size_t bytes_read;
uint32_t chunk_id = 0;
while ((bytes_read = fread(buffer, 1, CHUNK_SIZE, in)) > 0) {
// AAD vsebuje Chunk-ID za zaščito vrstnega reda
char aad[32];
snprintf(aad, sizeof(aad), "chunk:%u", chunk_id++);
uint8_t ct[CHUNK_SIZE + 28];
size_t ct_len;
uint8_t nonce[12], tag[16];
encrypt_message(buffer, bytes_read, aad, strlen(aad),
ct, &ct_len, nonce, tag);
fwrite(nonce, 1, 12, out);
fwrite(tag, 1, 16, out);
fwrite(ct, 1, ct_len, out);
}
return 0;
}
----
==== Brisanje ob Opustitvi ====
Vsi varnostno kritični podatki se po uporabi prepišejo:
* Ključi (po kriptografski operaciji)
* Čistopisi (po šifriranju)
* Skupne skrivnosti (po izmenjavi ključev)
**Implementacija:**
// Prepreči optimizacijo prevajalnika
static void secure_zero(void* ptr, size_t len) {
volatile uint8_t* p = (volatile uint8_t*)ptr;
while (len--) *p++ = 0;
}
----
==== L4Re Izolacija ====
Crypto Service teče kot izoliran L4Re task:
+---------------------------------------------------------------+
| L4Re Microkernel |
+---------------------------------------------------------------+
| | | | | |
| +--+--+ +---+---+ +---+---+ +---+---+ |
| | Sigma0 | | Moe | | Crypto | | OEM | |
| | (Root) | | (Mem) | | Service| | Gateway| |
| +--------+ +-------+ +--------+ +--------+ |
| | | |
| +--------------+ |
| SAMO ta IPC |
+---------------------------------------------------------------+
**Varnostne garancije:**
* Lasten naslovni prostor (brez neposrednega dostopa do pomnilnika)
* Dovoljen samo ekspliciten IPC (na osnovi zmožnosti)
* Brez dostopa do omrežja (air-gapped)
----
==== Odpravljanje Težav ====
| Simptom | Možen vzrok | Rešitev |
| Status 0x04 trajno | Key-Storage poškodovan | Ponovno generirajte ključe |
| Status 0x07 pogosto | Hitrost zahtev previsoka | Batching, caching |
| Status 0x08 | Rotacija ključa pozabljena | Generirajte nov ključ |
| Počasna zmogljivost | FIPS način + Debug | Uporabite release build |
| Puščanje pomnilnika | Odgovori niso obdelani | Počistite skupni pomnilnik |
----
[[.:api|< API Referenca]] | [[.:compliance|Naprej: Skladnost >]]