Tutorial ini akan mengajari Anda cara membuat hash yang aman menggunakan fungsionalitas bawaan dari modul hashlib Python.
Memahami pentingnya hashing dan cara menghitung hash aman secara terprogram dapat membantu—bahkan jika Anda tidak bekerja dalam keamanan aplikasi. Tapi kenapa?
Nah, saat mengerjakan proyek Python, Anda mungkin akan menemukan contoh di mana Anda khawatir menyimpan kata sandi dan info sensitif lainnya di database atau file kode sumber. Dalam kasus seperti itu, lebih aman menjalankan algoritme hashing pada info sensitif dan menyimpan hash daripada informasinya.
Dalam panduan ini, kami akan membahas apa itu hashing dan perbedaannya dengan enkripsi. Kami juga akan membahas properti fungsi hash yang aman. Kemudian, kami akan menggunakan algoritme hashing umum untuk menghitung hash teks biasa dengan Python. Untuk melakukan ini, kami akan menggunakan modul hashlib bawaan.
Untuk semua ini dan lebih banyak lagi, mari kita mulai!
Apa itu Hashing?
Proses hashing mengambil string pesan dan memberikan output dengan panjang tetap yang disebut hash. Berarti panjang hash keluaran untuk algoritme hashing tertentu adalah tetap – terlepas dari panjang masukan. Tetapi apa bedanya dengan enkripsi?
Dalam enkripsi, pesan atau teks biasa dienkripsi menggunakan algoritme enkripsi yang memberikan keluaran terenkripsi. Kami kemudian dapat menjalankan algoritma dekripsi pada keluaran terenkripsi untuk mendapatkan kembali string pesan.
Namun, hashing bekerja secara berbeda. Kami baru mengetahui bahwa proses enkripsi dapat dibalik karena Anda dapat beralih dari pesan terenkripsi ke pesan tidak terenkripsi dan sebaliknya.
Tidak seperti enkripsi, hashing bukanlah proses yang dapat dibalik, artinya kita tidak dapat beralih dari hash ke pesan masukan.
Properti Fungsi Hash
Mari kita segera membahas beberapa properti yang harus dipenuhi oleh fungsi hash:
- Deterministik: Fungsi hash bersifat deterministik. Diberi pesan m, hash dari m selalu sama.
- Tahan Preimage: Kami telah membahas ini ketika kami mengatakan hashing bukanlah operasi yang dapat dibalik. Properti resistensi preimage menyatakan bahwa tidak mungkin menemukan pesan m dari hash keluaran.
- Tahan Tabrakan: Seharusnya sulit (atau tidak layak secara komputasi) untuk menemukan dua string pesan yang berbeda m1 dan m2 sehingga hash m1 sama dengan hash m2. Properti ini disebut resistensi tabrakan.
- Tahan Preimage Kedua: Ini berarti diberi pesan m1 dan hash m2 yang sesuai, tidak mungkin untuk menemukan pesan lain m2 sehingga hash(m1) = hash(m2).
Modul hashlib Python
Modul hashlib bawaan Python menyediakan implementasi dari beberapa algoritma hashing dan message digest termasuk algoritma SHA dan MD5.
Untuk menggunakan konstruktor dan fungsi bawaan dari modul Python hashlib, Anda dapat mengimpornya ke lingkungan kerja Anda seperti ini:
import hashlib
Modul hashlib menyediakan konstanta algorithms_available dan algorithms_guaranteed , yang menunjukkan kumpulan algoritma yang implementasinya tersedia dan dijamin masing-masing pada platform.
Oleh karena itu, algorithms_guaranteed adalah subset dari algorithms_available.
Mulai REPL Python, impor hashlib dan akses konstanta algorithms_available dan algorithms_guaranteed:
>>> hashlib.algorithms_available
# Output {'md5', 'md5-sha1', 'sha3_256', 'shake_128', 'sha384', 'sha512_256', 'sha512', 'md4', 'shake_256', 'whirlpool', 'sha1', 'sha3_512', 'sha3_384', 'sha256', 'ripemd160', 'mdc2', 'sha512_224', 'blake2s', 'blake2b', 'sha3_224', 'sm3', 'sha224'}
>>> hashlib.algorithms_guaranteed
# Output {'md5', 'shake_256', 'sha3_256', 'shake_128', 'blake2b', 'sha3_224', 'sha3_384', 'sha384', 'sha256', 'sha1', 'sha3_512', 'sha512', 'blake2s', 'sha224'}
Kami melihat bahwa algorithms_guaranteed memang merupakan subset dari algorithms_available
Cara Membuat Objek Hash dengan Python
Selanjutnya mari kita pelajari cara membuat objek hash dengan Python. Kami akan menghitung hash SHA256 dari string pesan menggunakan metode berikut:
- Konstruktor new() umum
- Konstruktor Khusus Algoritma
Menggunakan konstruktor baru()
Mari menginisialisasi string pesan:
>>> message = "techking.id is awesome!"
Untuk membuat instance objek hash, kita dapat menggunakan konstruktor new() dan meneruskan nama algoritme seperti yang ditunjukkan:
>>> sha256_hash = hashlib.new("SHA256")
Kita sekarang dapat memanggil metode update() pada objek hash dengan string pesan sebagai argumennya:
>>> sha256_hash.update(message)
Jika Anda melakukannya, Anda akan mengalami kesalahan karena algoritme hashing hanya dapat bekerja dengan string byte.
Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: Unicode-objects must be encoded before hashing
Untuk mendapatkan string yang disandikan, Anda dapat memanggil metode encode() pada string metode, lalu menggunakannya dalam pemanggilan metode update(). Setelah melakukannya, Anda dapat memanggil metode hexdigest() untuk mendapatkan hash sha256 yang sesuai dengan string pesan.
sha256_hash.update(message.encode()) sha256_hash.hexdigest() # Output:'b360c77de704ad8f02af963d7da9b3bb4e0da6b81fceb4c1b36723e9d6d9de3d'
Alih-alih menyandikan string pesan menggunakan metode encode() , Anda juga dapat mendefinisikannya sebagai string byte dengan mengawali string dengan b seperti ini:
message = b"techking.id is awesome!" sha256_hash.update(message) sha256_hash.hexdigest() # Output: 'b360c77de704ad8f02af963d7da9b3bb4e0da6b81fceb4c1b36723e9d6d9de3d'
Hash yang diperoleh sama dengan hash sebelumnya, yang menegaskan sifat deterministik fungsi hash.
Selain itu, perubahan kecil pada string pesan akan menyebabkan hash berubah secara drastis (juga dikenal sebagai “efek longsoran salju”).
Untuk memverifikasi ini, mari ubah ‘a’ di ‘awesome’ menjadi ‘A’, dan hitung hash:
message = "techking.id is Awesome!" h1 = hashlib.new("SHA256") h1.update(message.encode()) h1.hexdigest() # Output: '3c67f334cc598912dc66464f77acb71d88cfd6c8cba8e64a7b749d093c1a53ab'
Kami melihat bahwa hash berubah sepenuhnya.
Menggunakan Konstruktor Khusus Algoritma
Pada contoh sebelumnya, kami menggunakan konstruktor new() generik dan meneruskan “SHA256” sebagai nama algoritme untuk membuat objek hash.
Alih-alih melakukannya, kita juga dapat menggunakan konstruktor sha256() seperti yang ditunjukkan:
sha256_hash = hashlib.sha256() message= "techking.id is awesome!" sha256_hash.update(message.encode()) sha256_hash.hexdigest() # Output: 'b360c77de704ad8f02af963d7da9b3bb4e0da6b81fceb4c1b36723e9d6d9de3d'
Hash keluaran identik dengan hash yang kami peroleh sebelumnya untuk string pesan “techking.id is awesome!”.
Menjelajahi Atribut Objek Hash
Objek hash memiliki beberapa atribut yang berguna:
- Atribut digest_size menunjukkan ukuran intisari dalam byte. Misalnya, algoritme SHA256 mengembalikan hash 256-bit, yang setara dengan 32 byte
- Atribut block_size mengacu pada ukuran blok yang digunakan dalam algoritma hashing.
- Atribut name adalah nama algoritma yang dapat kita gunakan di konstruktor new(). Mencari nilai atribut ini dapat membantu saat objek hash tidak memiliki nama deskriptif.
Kita dapat memeriksa atribut ini untuk objek sha256_hash yang kita buat sebelumnya:
>>> sha256_hash.digest_size 32 >>> sha256_hash.block_size 64 >>> sha256_hash.name 'sha256'
Selanjutnya, mari kita lihat beberapa aplikasi hashing yang menarik menggunakan modul hashlib Python.
Contoh Praktis Hashing
Memverifikasi Integritas Perangkat Lunak dan File
Sebagai pengembang, kami mengunduh dan menginstal paket perangkat lunak setiap saat. Ini benar terlepas dari apakah Anda bekerja di distro Linux atau di Windows atau Mac.
Namun, beberapa mirror untuk paket perangkat lunak mungkin tidak dapat dipercaya. Anda dapat menemukan hash (atau checksum) di samping tautan unduhan. Dan Anda dapat memverifikasi integritas perangkat lunak yang diunduh dengan menghitung hash dan membandingkannya dengan hash resmi.
Ini dapat diterapkan ke file di mesin Anda juga. Bahkan perubahan terkecil dalam konten file akan mengubah hash secara drastis, Anda dapat memeriksa apakah suatu file telah dimodifikasi dengan memverifikasi hash.
Ini contoh sederhana. Buat file teks ‘my_file.txt’ di direktori kerja, dan tambahkan beberapa konten ke dalamnya.
$ cat my_file.txt This is a sample text file. We are going to compute the SHA256 hash of this text file and also check if the file has been modified by recomputing the hash.
Anda kemudian dapat membuka file dalam mode biner baca (‘rb’), membaca konten file dan menghitung hash SHA256 seperti yang ditunjukkan:
>>> import hashlib >>> with open("my_file.txt","rb") as file: ... file_contents = file.read() ... sha256_hash = hashlib.sha256() ... sha256_hash.update(file_contents) ... original_hash = sha256_hash.hexdigest()
Di sini, variabel original_hash adalah hash dari ‘my_file.txt’ dalam kondisi saat ini.
>>> original_hash # Output: '53bfd0551dc06c4515069d1f0dc715d002d451c8799add29f3e5b7328fda9f8f'
Sekarang ubah file ‘my_file.txt’. Anda dapat menghapus spasi kosong ekstra sebelum kata ‘going’. 🙂
Hitung hash lagi dan simpan dalam variabel computed_hash.
>>> import hashlib >>> with open("my_file.txt","rb") as file: ... file_contents = file.read() ... sha256_hash = hashlib.sha256() ... sha256_hash.update(file_contents) ... computed_hash = sha256_hash.hexdigest()
Anda kemudian dapat menambahkan pernyataan penegasan sederhana yang menegaskan jika computed_hash sama dengan original_hash.
>>> assert computed_hash == original_hash
Jika file dimodifikasi (yang benar dalam kasus ini), Anda akan mendapatkan AssertionError:
Traceback (most recent call last): File "<stdin>", line 1, in <module> AssertionError
Anda dapat menggunakan hashing saat menyimpan informasi sensitif, seperti kata sandi di database. Anda juga dapat menggunakan hashing dalam autentikasi kata sandi saat menghubungkan ke database. Validasi hash dari kata sandi yang dimasukkan terhadap hash dari kata sandi yang benar.
Kesimpulan
Saya harap tutorial ini membantu Anda belajar tentang menghasilkan hash yang aman dengan Python. Berikut adalah takeaways utama:
- Modul hashlib Python menyediakan implementasi siap pakai dari beberapa algoritma hashing. Anda bisa mendapatkan daftar algoritme yang dijamin di platform Anda menggunakan hashlib.algorithms_guaranteed.
- Untuk membuat objek hash, Anda dapat menggunakan konstruktor new() generik dengan sintaks: hashlib.new(“nama-algo”). Sebagai alternatif, Anda dapat menggunakan konstruktor yang sesuai dengan algoritme hashing tertentu, seperti: hashlib.sha256() untuk hash SHA 256.
- Setelah menginisialisasi string pesan yang akan di-hash dan objek hash, Anda dapat memanggil metode update() pada objek hash, diikuti dengan metode hexdigest() untuk mendapatkan hash.
- Hashing dapat berguna saat memeriksa integritas artefak dan file perangkat lunak, menyimpan info sensitif di database, dan banyak lagi.
Selanjutnya, pelajari cara membuat kode pembuat kata sandi acak dengan Python.