Bakit hindi na lang SHA-256?
Ang isang ordinaryong cryptographic hash tulad ng ay tamang kasangkapan para sa integridad, ngunit maling kasangkapan para sa pag-iimbak ng mga password, at ang dahilan ay mismong ang katangiang nagpapagawang mabuti nito sa ibang lugar: mabilis ito. Ang isang umaatakeng nagnakaw ng isang database ng mga SHA-256 na password hash ay makakasubok ng bilyun-bilyong hula bawat segundo sa karaniwang hardware, dahil ang bawat hula ay isang mabilis na hash lamang. Ang mga karaniwang password ay bumabagsak nang halos kaagad. Ang bilis, ang birtud ng isang general-purpose hash, ay isang pananagutan dito.
Ang pag-iimbak ng password ay nangangailangan ng isang hash na sinadyang mabagal at lumalaban sa espesyalisadong hardware. Tatlong building block ang nagpapagana nito: salting, isang natutunang work factor, at memory hardness.
Salting: pagtalo sa precomputation
Ang isang salt ay isang natatanging random na halagang iniimbak katabi ng bawat password hash at ihinahalo sa hashing. Kung walang salt, ang magkaparehong password ay gumagawa ng magkaparehong hash, kaya maaaring i-precompute ng isang umaatake ang isang napakalaking talahanayan ng mga hash ng karaniwang password nang isang beses (isang "rainbow table") at hanapin ang bawat tugma nang kaagad. Ang isang natatanging salt sa bawat password ang nagpapagawang walang halaga ang precomputation na iyon: kailangang atakihin ng umaatake ang bawat hash nang isa-isa, at ang parehong password ay nag-ha-hash nang iba para sa bawat user. Ang mga modernong password-hashing function ang gumagawa at nag-iimbak ng salt para sa iyo.
Work factor: pagpapamahal sa bawat hula
Ang isang work factor (o cost parameter) ang kumukontrol kung gaano karaming pagkukuwenta ang kinukuha ng bawat hash. Itakda ito upang ang isang hash ay sapat na mabagal para hindi mapansin sa isang lehitimong pag-login (ilang daang millisecond) ngunit nagpaparusa sa malaking sukat. Dahil ito ay isang parameter, maaari mo itong itaas sa paglipas ng mga taon habang bumibilis ang hardware, na pinananatiling halos pare-pareho ang gastos ng paghula. Ito ang dial na simpleng wala sa isang general-purpose hash.
Ang tatlong standard na pagpipilian
- Ang bcrypt ay ang matagal nang umiiral, mauunawaang pagpipilian, itinayo sa Blowfish cipher na may configurable na cost factor. Isang ligtas na default kung saan ito magagamit.
- Ang scrypt ay nagdaragdag ng memory hardness: sinasadya nitong ubusin ang isang natutunang dami ng memorya, na pumupurol sa mga umaatakeng gumagamit ng GPU at custom na chip, dahil mas mura ang pag-scale ng mga ito sa pagkukuwenta kaysa sa memorya.
- Ang Argon2 ay nanalo sa Password Hashing Competition noong 2015 at siyang kasalukuyang rekomendasyon para sa mga bagong sistema. Memory-hard ito na may magkakahiwalay na dial para sa memorya, oras, at parallelism; ang variant na Argon2id ang karaniwang pagpipilian.
Alinman sa mga ito ay isang makatuwirang pagpipilian; ang pangunahing tuntunin ay gumamit ng isa sa kanila, kailanman ay hindi isang hubad na mabilis na hash, at kailanman ay hindi mag-imbento ng sarili mong scheme.
Ang aral
Gamitin ang SHA-256 (sa tool na Hash) para sa mga checksum at integridad, kung saan ang bilis ay isang tampok. Para sa mga password, abutin ang bcrypt, scrypt, o Argon2, kung saan ang kabagalan at gastos sa memorya ang buong punto. Ang dalawang gawain ay magkamukha at humihingi ng magkasalungat na kasangkapan.