Cryptology Academy · Lektion

OpenSSL API: Kernestrukturer og faldgruber

Bliv fortrolig med EVP-API'er, BIO-abstraktioner og de mest almindelige mønstre for forkert brug af OpenSSL API'et.

Lektion 2 af 413 trin

OpenSSL API: Kernestrukturer og faldgruber er en gratis Cryptology Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Cryptology Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Cryptology Academy-kurset indeholder 4 lektioner i alt.

EVP-API'en: Grænsefladen på højt niveau

EVP (Envelope)-API'en er OpenSSL's grænseflade på højt niveau til kryptografiske operationer og er den korrekte API at bruge i applikationskode. Den abstraherer algoritmespecifikke detaljer bag en ensartet grænseflade, understøtter automatisk hardwareacceleration via engine- og provider-mekanismer og håndterer detaljer om polstring og tilstand korrekt. OpenSSL's lavniveau-API'er, der er specifikke for algoritmer, er forældede i moderne versioner og bør undgås.

EVP_CIPHER_CTX til symmetrisk kryptering

Symmetrisk kryptering i OpenSSL bruger kontekstobjektet EVP_CIPHER_CTX. Rækkefølgen af operationerne er: EVP_CIPHER_CTX_new for at allokere konteksten, EVP_EncryptInit_ex for at initialisere den med krypteringsalgoritme og nøgle, EVP_EncryptUpdate gentagne gange for at behandle data, EVP_EncryptFinal_ex for at tømme den sidste blok og hente det resterende resultat samt EVP_CIPHER_CTX_free for at frigive hukommelsen. Det er en almindelig fejl at springe EncryptFinal_ex over, fordi det giver et afkortet resultat.

EVP_MD_CTX til hashberegning

Beskedfordøjelse bruger EVP_MD_CTX på tilsvarende måde: EVP_MD_CTX_new, EVP_DigestInit_ex med algoritmen (EVP_sha256(), EVP_sha3_256() osv.), EVP_DigestUpdate med datablokke og EVP_DigestFinal_ex for at hente hashværdien. HMAC-operationer bruger en separat HMAC_CTX eller den nyere EVP_MAC-API. EVP-abstraktionen gør det muligt at udskifte hash-algoritmer ved kun at ændre ét funktionskald.

EVP_PKEY til asymmetriske nøgler

EVP_PKEY er det samlede asymmetriske nøgleobjekt i OpenSSL og understøtter RSA, ECDSA, Ed25519, DH og andre algoritmer via en enkelt grænseflade. Nøgler oprettes fra PEM- eller DER-filer med PEM_read_PrivateKey og PEM_read_PUBKEY eller genereres med EVP_PKEY_keygen. EVP_PKEY_sign og EVP_PKEY_verify udfører signering og verificering for enhver nøgletype ved hjælp af de samme funktionskald.

BIO-abstraktion til indlæsning og skrivning

BIO (Basic I/O) er OpenSSL's abstraktionslag til indlæsning og skrivning, som gør det muligt at læse og skrive TLS-beskyttede eller rå data gennem en kæde af BIO-objekter. En BIO-kæde kan for eksempel bestå af BIO_new_ssl (TLS-lag), der er kædet sammen med BIO_new_connect (TCP-forbindelse). Når du skriver til SSL-BIO'en, krypteres og sendes data automatisk; læsning dekrypterer modtagne data. BIO-objekter understøtter filer, sockets, hukommelsesbuffere og filtre (base64, buffering).

SSL_CTX- og SSL-objekter

TLS-forbindelser i OpenSSL bruger to objekter: SSL_CTX (kontekst), som gemmer den fælles konfiguration: certifikat, privat nøgle, CA-pakke, begrænsninger for protokolversioner og krypteringsliste. SSL repræsenterer en individuel forbindelse, der er afledt af konteksten. Opret én SSL_CTX pr. applikation, og opret derefter SSL-objekter ud fra den til hver forbindelse. SSL_read og SSL_write overfører klartekst; OpenSSL håndterer al TLS-indramning og kryptering internt.

Kritisk faldgrube: Ignorering af returværdier

Den farligste OpenSSL-fejl er at ignorere returværdier. EVP_EncryptFinal_ex, SSL_read og SSL_write returnerer negative værdier eller nul for at angive fejl. Hvis du kalder SSL_read i en løkke uden at kontrollere SSL_get_error, kan det medføre uendelige løkker eller skjulte fejl. Returværdien skal kontrolleres for alle OpenSSL-funktioner, der kan mislykkes; fejlene angiver ofte sikkerhedsrelevante forhold som fejl under håndtrykket eller fejl ved certifikatvalidering.

Faldgrube: Manglende kontrol af SSL_get_error

SSL_read og SSL_write kan returnere SSL_ERROR_WANT_READ eller SSL_ERROR_WANT_WRITE, hvilket angiver, at operationen skal prøves igen efter at have ventet på indlæsning eller skrivning. Det er ikke egentlige fejl, men meddelelser om ikke-blokerende indlæsning og skrivning. Kode, der ikke kalder SSL_get_error og forgrener korrekt på want-read/want-write, vil enten køre i en travl løkke eller fejlagtigt behandle disse forhold som fejl. Brug altid SSL_get_error til at fortolke negative returværdier fra TLS-indlæsnings- og -skrivningsoperationer.

Forældede lavniveau-API'er

OpenSSL indeholder mange forældede lavniveau-funktioner, som ikke bør forekomme i ny kode: direkte kald til DES_encrypt1, direkte brug af SHA1- eller MD5-hashfunktioner uden EVP-laget, RSA_private_encrypt i stedet for EVP_PKEY_sign samt AES_encrypt (AES-ECB uden autentificering). Disse API'er omgår sikkerhedstjek, bruger forældede algoritmer eller er ganske enkelt mindre sikre end deres EVP-ækvivalenter. Compileradvarsler markerer ofte brug af forældede API'er.

Hukommelseslækager i OpenSSL-kode

OpenSSL bruger eksplicit hukommelseshåndtering; alle allokerede objekter skal frigives eksplicit. Almindelige hukommelseslækager omfatter at glemme EVP_CIPHER_CTX_free efter kryptering, ikke at kalde SSL_free efter lukning af en forbindelse eller ikke at kalde X509_free efter certifikatverificering. I langkørende servere medfører disse lækager gradvis udtømning af hukommelsen. Brug værktøjer som valgrind eller AddressSanitizer til at finde hukommelseslækager i OpenSSL under udviklingen.

OpenSSL 3.0's providermodel

OpenSSL 3.0 introducerede providermodellen, som erstatter den ældre ENGINE-API til hardwareacceleration. Providere er moduler, der kan indlæses, og som implementerer kryptografiske algoritmer: standardprovideren (software), legacy-provideren (ældre algoritmer), FIPS-provideren (valideret efter FIPS 140-2) samt tredjepartsprovidere til HSM'er. FIPS-provideren muliggør drift i overensstemmelse med kravene ved at begrænse de tilgængelige algoritmer til dem, der er godkendt efter FIPS 140-2, uden at applikationskoden skal ændres.

Betydningen af EVP-API'en

Hvorfor foretrækkes OpenSSL's EVP-API frem for lavniveau-API'er, der er specifikke for algoritmer?

Opsummering af OpenSSL-API'en

Opsummering af OpenSSL-API'en: Brug altid EVP-API'en på højt niveau, EVP_CIPHER_CTX til symmetriske operationer, EVP_MD_CTX til hashberegning, EVP_PKEY til asymmetriske nøgler, BIO-kæder til abstraktion af indlæsning og skrivning, SSL_CTX og SSL til TLS-forbindelser, kontrollér altid returværdier, og kald SSL_get_error, frigiv alle allokerede objekter for at forhindre lækager, undgå forældede lavniveau-funktioner, og brug OpenSSL 3.0-providere til overensstemmelse med FIPS-krav eller hardwareacceleration.

Gratis at komme i gang

Lær Cryptology Academy med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
67
Lektioner
261

Ofte stillede spørgsmål

Er lektionen “OpenSSL API: Kernestrukturer og faldgruber” gratis?

Ja — hele teksten til “OpenSSL API: Kernestrukturer og faldgruber” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Cryptology Academy-kurset, skal du opgradere til CoddyKit PRO. Cryptology Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “OpenSSL API: Kernestrukturer og faldgruber”?

Bliv fortrolig med EVP-API'er, BIO-abstraktioner og de mest almindelige mønstre for forkert brug af OpenSSL API'et. Du øver dig i Cryptology Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Cryptology Academy?

Der kræves ingen tidligere erfaring. Cryptology Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “OpenSSL API: Kernestrukturer og faldgruber”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Cryptology Academy-lektion?

Ja. Alle Cryptology Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. libsodium: Et kryptobibliotek, der modvirker fejlbrug
  2. OpenSSL API: Kernestrukturer og faldgruber
  3. Google Tink: Sikker kryptografi på højt niveau
  4. Audit og valg af kryptografiske afhængigheder
← Tilbage til Cryptology Academy