Nem kell az egészet aláírni. Generálsz belőle egy hash-t és aláírod azt, vagy akár letitkosítod. Vagy valamilyen CRC-t. Nehogy már 256-512 bitet több erőforrás legyen aláírni, mint megabájtokat titkosítani. ? A lényeg annyi, hogy nyilvános adat ne legyen titkosítva.
Pontosan így van. Több erőforrás kell hozzá.
Csak a te kedvedért csináltam gyorsan pár mérést.
- Az SHA256 eredményét előre kiszámoltam és binárisan egy állományba került (32 byte), azaz a hash képzést nem számoltam bele a futási időbe.
- A szimmetrikus kulcsú algoritmusoknál előre megcsináltam a jelszóból a kulcsot, a saltot és az IV-t. Egy TLS session esetén ezeket is csak egyszer végzed el.
- Mértem 2048 és 4096 bites RSA kulcsokkal, illetve AES-128 és AES-256-al.
Az eredmény:
- Egy RSA-2048 signing nagyjából annyi időbe telik mint titkosítani 1MiB adatot. Mindegy, hogy AES-128 vagy AES-256.
- Egy RSA-4096 signing nagyjából kétszer annyi időbe telik mint titkosítani 1MiB adatot. Mindegy, hogy AES-128 vagy AES-256.
- Ezek alapján csak akkor éri meg signingot használni ha kevés és nagy (nagyobb mint 1MiB) állományod van ami a mai web oldalak esetén nem jellemző. Ezekben a mérésekben az nincs benne hogy miképp állítod elő a hasht szerver oldalon (amit lehet cache-elni valamilyen szinten) és hogy a kliens oldalon is újra kell számolnod azt miután feldolgoztad a választ. Ezzel így sokkal nagyobb terhelést tolsz a kliensekre mint a jelenlegi helyzetben. De legfeljebb majd újravásárolják az emberek a számítógépeiket...
A "nyers" mérés:
$ openssl dgst -binary -sha256 data.zip > hash.sha256
$ time for (( I=0; I < 1000; I++ )); do openssl pkeyutl -sign -in hash.sha256 -inkey sign-2048.pem -pkeyopt digest:sha256 -keyform PEM -out data.sign; done
real 0m6,469s
user 0m4,567s
sys 0m1,958s
$ time for (( I=0; I < 1000; I++ )); do openssl pkeyutl -sign -in hash.sha256 -inkey sign-4096.pem -pkeyopt digest:sha256 -keyform PEM -out data.sign; done
real 0m11,140s
user 0m9,230s
sys 0m1,964s
$ openssl enc -aes128 -in random.100k -pass env:PASSWORD -pbkdf2 -P
$ time for (( I=0; I<1000; I++ )); do openssl enc -aes128 -in random.100k -K C25A924B9A6D2C60890F46D6E1FF6E69 -S DAA031DFCD3D0E5E -iv 02F0A6C57C55484F273AF78C3D2AE088 -out random.100k-enc; done
real 0m4,600s
user 0m2,608s
sys 0m2,049s
$ time for (( I=0; I<1000; I++ )); do openssl enc -aes128 -in random.1m -K C25A924B9A6D2C60890F46D6E1FF6E69 -S DAA031DFCD3D0E5E -iv 02F0A6C57C55484F273AF78C3D2AE088 -out random.1m-enc; done
real 0m6,338s
user 0m3,526s
sys 0m2,621s
$ openssl enc -aes256 -in random.100k -pass env:PASSWORD -pbkdf2 -P
$ time for (( I=0; I<1000; I++)); do openssl enc -aes256 -in random.100k -K 669B503D906C355F4D60C98727059A6843B6EA7F21527D53E3B11A7F70DA6783 -S F6E271EE2CE181C7 -iv 4C482E14A915A6B48BD44DD0A23A1A88 -out random.100k-enc; done
real 0m4,470s
user 0m2,547s
sys 0m1,964s
$ time for (( I=0; I<1000; I++)); do openssl enc -aes256 -in random.1m -K 669B503D906C355F4D60C98727059A6843B6EA7F21527D53E3B11A7F70DA6783 -S F6E271EE2CE181C7 -iv 4C482E14A915A6B48BD44DD0A23A1A88 -out random.1m-enc; done
real 0m6,841s
user 0m3,929s
sys 0m2,547s