Etikettarkiv: OpenSSL

Krypto och säkerhet i en övervakad värld

Uppdaterad 2013-09-13 om CryptoAPI.

Efter nattens nya avslöjanden om NSAs avlyssning har det kommit mycket frågor om vad som stämmer, vad som kan vara knäckt, vad man kan lita på och hur man kan skydda sig.

Eftersom det trots alla avslöjanden saknas mycket konkret information om vilka algoritmer, protokoll, produkter och tjänster som på olika sätt är svagare än förväntat är det fortfarande klart förvirrande. Men jag tycker att den analys och de rekommendationer som Bruce Schneier publicerat är bra.

En av de stora frågorna är huruvida SSL/TLS faktiskt är säkert. Forskaren Matthew Green har publicerat en bra analys väl värd att läsa. Han och Bruce är relativt samstämmiga i att algoritmerna, inte minst AES är bra. Även om NSA har kryptologer som hittar sätt att reducera styrkan hos AES med ett antal bitar är det inte det som är det konkreta problemet (det är faktiskt det dom förväntas arbeta med).

Nej problemet är att man nu säger att man på olika sätt attackerar implementationerna av ex SSL/TLS. Antingen hittar svagheter som sedan utnyttjas eller mer tveksamt tvingar leverantörerna att införa svagheter. Det vill säga man avsiktligt gör oss alla mer sårbara än nödvändigt, för dessa sårbarheter kan hittas och utnyttjas inte bara av NSA och deras kompisar.

De vanligaste implementationerna av SSL är troligen Microsofts CryptoAPI samt OpenSSL. Den första är stängd för granskning kräver avtal för att få rätt att granska koden och kan därför inte ges samma tilltro som en öppen och fri lösning där alla när som helst kan granska, modifiera, bygga och sedan kommunicera sina observationer och erfarenheter.

OpenSSL är öppen kod, men har en historik med mycket svagheter (som dock högst troligt inte är avsiktliga) vilket visar att säkerheten och tilliten inte med nödvändighet är fantastiskt bara för att koden är öppen. Men just nu är OpenSSL, GnuTLS, Nettle, Sodium och liknande öppna bibliotek antagligen det bästa vi kan använda.

Vad gäller hårdvara är det svårare. Vi kan nog utgå ifrån att en normal processor generellt utför sina beräkningar på ett korrekt och förväntat sätt. Även instruktioner för kryptoacceleration som Intels AES-NI ger verifierbart korrekt kryptering och dekryptering. Däremot vet man inte vad som faktiskt sker med nyckeln som används förutom det förväntade beteendet.

Än mer problematiskt blir det med inbyggda slumptalsgeneratorer som Intels nya RdRand (Bull Mountain). Den går knappast i dagsläget att lita på och använda direkt för nyckelgenerering. Att använda RdRand som en av flera entropikällor som sedan matar en PRNG man litar på bör fortsatt kunna fungera.

En intressant sak som kom fram i natt var att misstankarna om bakdörren i NISTs slumptalsgenerator Dual_EC_DBRG antagligen bekräftades. Detta visar vikten av att standarder utvecklas i en öppen process och att alla detaljer in en specifikation går att härleda. Det är bland annat därför det Kinesiska strömkryptot för mobilsystem ZUC är svårt att lita på eftersom det innehåller konstanter och detaljer som inte går att härleda.

Det enkla vi kan göra är att använda öppna implementationer av algoritmer som tagits fram i en öppen process. Och kan vi välja en längre nyckel så gör det. Det kostar väldigt lite för dig som användare men gör det mycket svårare för motståndaren oavsett vem det är. Och tänk igenom på vilka verktyg du använder för att generera och lagra nycklar. Att använda 1024 bitars RSA-nycklar för egen kommunikation eller i certifikat känns i dag som fel.

Avslutar med ännu en länk. Denna gången till en chatt med säkerhetsexperten Jakob Schlyter på Kirei som tänker bra och klokt.

Bittester av kryptografiska hashfunktioner

Kryptografiska hashfunktioner (och krypton) har en egenskap kallas lavineffekten. Lavineffekten innebär att små förändringar av indata ger stora förändring på det genererade hashvärdet.

Hashvärden för SHA-256 när S ändras till T.
Hashvärden för SHA-256 när S ändras till T.

Men hur stor är lavineffekten, och finns det indata som ger olika stor lavineffekt? Jag bestämde mig för att testa på de hashfunktioner som finns i biblioteket OpenSSL (version 0.9.8r).

Jag har använt ordlistan från OpenWalls lösenordsknäckare John The Ripper och behandlat varje enskilt ord som ett sepatat meddelande. För varje meddelande har jag beräknat ett hashvärde. Sedan har jag inverterat den första biten i varje ord och genererat ett nytt hashvärde. Sedan räknar jag alla bitar som växlat mellan de två värdena. Sedan gör jag detta för varje hashfunktion och beräknar statistik. Men närmare 4 miljoner ord i listan blir det många hashfunktionsoperationer.

Så här ser resultatet från körningarna ut:

Statistics for md5
Digest size in bits: 128
Number of words tested: 3917116
Min number of bits changed: 36
Min percentage of digest changed: 28.1
Max number of bits changed: 93
Max percentage of digest changed: 72.7
Average number of bits changed 64.0

Statistics for sha1
Digest size in bits: 160
Number of words tested: 3917116
Min number of bits changed: 49
Min percentage of digest changed: 30.6
Max number of bits changed: 112
Max percentage of digest changed: 70.0
Average number of bits changed 80.0

Statistics for sha224
Digest size in bits: 224
Number of words tested: 3917116
Min number of bits changed: 72
Min percentage of digest changed: 32.1
Max number of bits changed: 150
Max percentage of digest changed: 67.0
Average number of bits changed 112.0
Expected average: 896.0

Statistics for sha256
Digest size in bits: 256
Number of words tested: 3917116
Min number of bits changed: 89
Min percentage of digest changed: 34.8
Max number of bits changed: 171
Max percentage of digest changed: 66.8
Average number of bits changed 128.0

Statistics for sha384
Digest size in bits: 384
Number of words tested: 3917116
Min number of bits changed: 144
Min percentage of digest changed: 37.5
Max number of bits changed: 243
Max percentage of digest changed: 63.3
Average number of bits changed 192.0

Statistics for sha512
Digest size in bits: 512
Number of words tested: 3917116
Min number of bits changed: 201
Min percentage of digest changed: 39.3
Max number of bits changed: 316
Max percentage of digest changed: 61.7
Average number of bits changed 256.0

För samtliga testade hashfunktioner växlar i medelfallet hälften av alla bitar. Däremot är variansen för de äldre funktionerna SHA-1 och speciellt MD5 större än för SHA-2-funktionerna. Den snävare variansen för SHA-2 gör att det blir svårare att genom exempelvis sidoattacker försöka säga något om vilka meddelanden hashfunktionen bearbetar. Ingen av funktionerna ger med något av testmeddelandena en förvånande liten eller stor bitväxlingar.

Nästa steg är att testa finalisterna i NISTS SHA-3-tävling samt även jämföra med hashfunktioner som inte kryptografiskt säkra. Då bör vi se större varians och kanske även lite krockar.

Prestandatester av hashfunktioner

Den senaste tiden har jag tittat en del på prestanda och beteende hos olika kryptografiska hashfunktioner. OpenSSL innehåller funktioner och kommandon (kommandot speed) för att utföra prestandatester på den plattform dom körs. Maskinen jag kör på är utrustad med en 2.7 GHz Intel Core i7 och kör ett 64-bitars operativsystem. Den testade versionen av OpenSSL är 0.9.8r. När jag testar på min huvudmaskin får jag följande resultat:

Resultat från prestandatest av OpenSSL
Resultat från prestandatest av OpenSSL

Som förväntat är MD5 snabbast, tätt följt av SHA-1. Men en sak värd att lägga märke till är prestandan för SHA-2-funktionerna SHA-256 och SHA-512. För alla andra testfall än 16 Bytes data är SHA-512 snabbare. Detta kan tyckas underligt, om man tänker sig att göra avvägning mellan prestanda och säkerhet – att SHA-512 ger högre säkerhet till priset av prestanda. SHA-512 utför även 80 iterationer för att bearbeta ett datablock, och SHA-256 bara 64 iterationer. Men SHA-512 använder 64-bitarsoperationer och arbetar på större block än SHA-256 – 128 Bytes kontra 64 Bytes. Detta gör att SHA-512 på en maskin som min blir effektivare.

NIST, organisationen som specificerat SHA-2 (och SHA-1 samt arbetar med att ta fram SHA-3) har insett detta och presenterade i början av 2011 en ny version av specifikationen FIPS 180. Detta dokument specificerar SHA-1 och SHA-2. I den nya versionen finns det två nya funktioner – SHA-512/224 och SHA-512/256. Precis som SHA-384 är dessa funktioner SHA-512, men där det genererade hashvärdet kapas av till den bitstorlek som önskas. Använder du SHA-256 och har prestandaproblem kan det därför vara värt att titta SHA-512/256 på dessa funktioner.

Notera att SHA-384, SHA-512/224 och SHA-512/256 inte är exakt samma funktion som SHA-512. Det som skiljer är initialvärdena i interntillståndet. Dvs att implementera SHA-512/256 kräver lite mer än att köra med SHA-512 och kasta bort den högra halvan av hashvärdet. Koden i implementationen måste ändras, om än i liten grad.

För den som vill titta närmare på prestandan hos många olika hashfunktioner inklusive finalisterna i SHA-3-tävlingen finns det massor med data hos EU-projektet eBASH.

SSH-klient i webbläsaren och bra dokumentation för OpenSSL

Secure Shell (SSH) är ett protokoll för säker anslutning mot datorer över Internet. SSH är även namnet på den terminalapplikation som implementerar protokollet för att ge interaktiv, säker access. SSH används ofta för att tunnla andra protokoll. Bilden nedan visar hur SSH används för att tunnla X11-protkollet så att fönster på fjärrmaskinen visas på den lokala maskinen.

SSH som tunnlar X11-protokollet.

Det finns även flera andra applikationer som implementerar ssh-protokollet. Ofta byggs dessa på bibliotek som libssh2.

Gate one är en implementation av en SSH-klient skriven i HTML5 som körs direkt i webbläsaren. Gate One. Några fördelar med Gate One enligt dess webbplats är:

  • No browser plugins required!
  • Supports multiple simultaneous terminal sessions. As many as your hardware can handle.
  • Users can re-connect to their running terminals whenever they like from anywhere.
  • Can be embedded into other applications.
  • Includes powerful plugin system that supports plugins written in Python, JavaScript, and even CSS (yes, you can write a CSS-only plugin).
  • The Gate One server can be stopped & started without users losing their running terminal applications (even SSH sessions stay connected!). In essence, worry-free upgrades!
  • The SSH plugin allows users to duplicate sessions without having to re-enter their username and password (it re-uses the existing SSH tunnel).
  • Provides users with the ability to play back and save/share their terminal sessions via a self-contained HTML playback file.
  • Similarly, supports server-side logging, recording, and video-like playback of user sessions.
  • It can even log to syslog to support whatever centralized logging system you want.
  • Keberos-based Single Sign-on support is included. It even works with Active Directory. Other authentication options are available as well.

Det finns ingen testsida för Gate One, däremot en demofilm på Vimeo:

Gate One Beta Demo from Dan McDougall on Vimeo.

Gate One är ett exmpel på hur webbläsaren allt mer blir en ersättning för det lokala datorskrivbordet och den grafiska miljön. Men även om Gate One inte beror av några plugins utan bara websockets krävs det en del på serversidan för att få det hela att snurra. Dokumentationen för Gate One beskriver mer om vad som krävs för att sätta upp Gate One som terminalgränssnitt för din webbtjänst.

Ett bibliotek som Gate One använder är OpenSSL (via Python-wrapperns PyOpenSSL.

OpenSSL och dess underliggande bibliotek libssl är en mycket kraftfull verktyslåda som används i applikationer för att skapa säker kommunikation, som implementation av specifika algoritmer (krypto, hashfunktioner, protokoll) samt för som interaktivt verktyg. Behöver du på något sätt arbeta med säkerhet är det en stark rekommendation att lära dig mer om OpenSSL.

En bra start för detta kan vara den här användarhjälpen (HOWTO) som visar hur du kan lösa specifika problem med OpenSSL. Bra, tydlig och klart läsvärd.