Saya pernah mendengar orang berbicara tentang "basis 64 encoding" di sana-sini. Untuk apa ini digunakan?
Saya pernah mendengar orang berbicara tentang "basis 64 encoding" di sana-sini. Untuk apa ini digunakan?
Jawaban:
Ketika Anda memiliki beberapa data biner yang ingin Anda kirim melalui jaringan, Anda biasanya tidak melakukannya dengan hanya mengalirkan bit dan byte melalui kabel dalam format mentah. Mengapa? karena beberapa media dibuat untuk streaming teks. Anda tidak pernah tahu - beberapa protokol dapat menafsirkan data biner Anda sebagai karakter kontrol (seperti modem), atau data biner Anda dapat dikacaukan karena protokol yang mendasarinya mungkin berpikir bahwa Anda telah memasukkan kombinasi karakter khusus (seperti bagaimana FTP menerjemahkan baris akhir).
Jadi untuk menyiasatinya, orang menyandikan data biner menjadi karakter. Base64 adalah salah satu dari jenis pengkodean ini.
Kenapa 64?
Karena Anda umumnya dapat mengandalkan 64 karakter yang sama yang ada di banyak set karakter, dan Anda dapat cukup yakin bahwa data Anda akan berakhir di sisi lain dari kawat tidak rusak.
Ini pada dasarnya cara pengkodean data biner acak dalam teks ASCII. Dibutuhkan 4 karakter per 3 byte data, plus berpotensi sedikit padding di akhir.
Intinya setiap 6 bit input dikodekan dalam alfabet 64 karakter. Alfabet "standar" menggunakan AZ, az, 0-9 dan + dan /, dengan = sebagai karakter padding. Ada varian URL-aman.
Wikipedia adalah sumber informasi yang cukup bagus.
binary strings
. (sumber) php.net/manual/en/function.pack.php
Pengkodean basis-64 adalah cara mengambil data biner dan mengubahnya menjadi teks sehingga lebih mudah dikirim dalam hal-hal seperti email dan data formulir HTML.
Ini adalah pengkodean data biner tekstual di mana teks yang dihasilkan hanya memiliki huruf, angka dan simbol "+", "/" dan "=". Ini adalah cara yang nyaman untuk menyimpan / mengirim data biner melalui media yang secara khusus digunakan untuk data tekstual.
Tapi mengapa Base-64? Dua alternatif untuk mengubah data biner menjadi teks yang langsung muncul di pikiran adalah:
Base-64 memetakan 3 byte (8 x 3 = 24 bit) dalam 4 karakter yang span 6-bit (6 x 4 = 24 bit). Hasilnya terlihat seperti "TWFuIGlzIGRpc3Rpb ...". Oleh karena itu kembung hanya 4/3 = 1,3333333 kali asli.
Selain dari apa yang telah dikatakan, dua kegunaan yang sangat umum yang belum terdaftar adalah
Hash:
Hash adalah fungsi satu arah yang mengubah blok byte menjadi blok byte lain dengan ukuran tetap seperti 128bit atau 256bit (SHA / MD5). Mengubah byte yang dihasilkan ke Base64 membuatnya lebih mudah untuk menampilkan hash terutama ketika Anda membandingkan sebuah checksum untuk integritas. Hash sering terlihat di Base64 sehingga banyak orang mengira Base64 sendiri sebagai hash.
Kriptografi:
Karena kunci enkripsi tidak harus berupa teks tetapi byte mentah, kadang-kadang diperlukan untuk menyimpannya dalam file atau database, yang berguna untuk Base64. Sama dengan byte terenkripsi yang dihasilkan.
Perhatikan bahwa meskipun Base64 sering digunakan dalam kriptografi bukanlah mekanisme keamanan. Siapa pun dapat mengonversi string Base64 kembali ke byte aslinya, sehingga tidak boleh digunakan sebagai sarana untuk melindungi data, hanya sebagai format untuk menampilkan atau menyimpan byte mentah lebih mudah.
Sertifikat
sertifikat x509 dalam format PEM adalah basis 64 disandikan. http://how2ssl.com/articles/working_with_pem_files/
Bertahun-tahun yang lalu, ketika fungsionalitas pengiriman diperkenalkan, jadi itu benar-benar berbasis teks, seiring berjalannya waktu, kebutuhan akan lampiran seperti gambar dan media (audio, video dll) muncul. Ketika lampiran ini dikirim melalui internet (yang pada dasarnya dalam bentuk data biner), kemungkinan data biner semakin rusak dalam bentuk mentahnya. Jadi, untuk mengatasi masalah ini, BASE64 datang.
Masalah dengan data biner adalah bahwa ia berisi karakter nol yang dalam beberapa bahasa seperti C, C ++ merupakan akhir dari string karakter sehingga mengirimkan data biner dalam bentuk mentah yang berisi byte NULL akan menghentikan file agar tidak sepenuhnya dibaca dan menyebabkan data yang korup.
Sebagai contoh :
Dalam C dan C ++, karakter "null" ini menunjukkan akhir sebuah string. Jadi "HELLO" disimpan seperti ini:
HALO
72 69 76 76 79 00
00 mengatakan "berhenti di sini".
Sekarang mari selami cara kerja pengkodean BASE64.
Poin yang perlu diperhatikan: Panjang string harus dalam kelipatan 3.
Contoh 1 :
String yang akan dikodekan: "ace", Panjang = 3
1) Ubah setiap karakter menjadi desimal.
a = 97, c = 99, e = 101
2) Ubah setiap representasi biner desimal menjadi 8-bit.
97 = 01100001, 99 = 01100011, 101 = 01100101
Gabungan: 01100001 01100011 01100101
3) Terpisah dalam kelompok 6-bit.
011000 010110 001101 100101
4) Hitung biner ke desimal
011000 = 24, 010110 = 22, 001101 = 13, 100101 = 37
5) Karakter desimal terselubung ke base64 menggunakan diagram base64.
24 = Y, 22 = W, 13 = N, 37 = l
“Ace” => “YWNl”
Contoh 2:
String yang akan dikodekan: "abcd" Panjang = 4, itu bukan kelipatan 3. Jadi untuk membuat panjang string kelipatan 3, kita harus menambahkan 2 bit padding untuk membuat panjang = 6. Bit padding diwakili oleh tanda "=".
Poin yang perlu diperhatikan: Satu bit padding sama dengan nol nol jadi dua bit padding sama dengan empat nol nol.
Jadi mari kita mulai proses: -
1) Ubah setiap karakter menjadi desimal.
a = 97, b = 98, c = 99, d = 100
2) Ubah setiap representasi biner desimal menjadi 8-bit.
97 = 01100001, 98 = 01100010, 99 = 01100011, 100 = 01100100
3) Pisahkan dalam kelompok 6-bit.
011000, 010110, 001001, 100011, 011001, 00
jadi 6-bit terakhir tidak lengkap sehingga kami memasukkan dua bit padding yang sama dengan empat nol "0000".
011000, 010110, 001001, 100011, 011001, 000000 ==
Sekarang sama saja. Dua tanda sama dengan pada akhir menunjukkan bahwa 4 nol ditambahkan (membantu dalam decoding).
4) Hitung biner ke desimal.
011000 = 24, 010110 = 22, 001001 = 9, 100011 = 35, 011001 = 25, 000000 = 0 ==
5) Karakter desimal terselubung ke base64 menggunakan diagram base64.
24 = Y, 22 = W, 9 = j, 35 = j, 25 = Z, 0 = A ==
“Abcd” => “YWJjZA ==”
Pada hari-hari awal komputer, ketika komunikasi antar-sistem saluran telepon tidak terlalu dapat diandalkan, metode cepat & kotor memverifikasi integritas data digunakan: "bit parity". Dalam metode ini, setiap byte yang ditransmisikan akan memiliki 7-bit data, dan yang ke-8 adalah 1 atau 0, untuk memaksa jumlah total 1 bit dalam byte menjadi genap.
Maka 0x01 akan ditransmisikan sebagai 0x81; 0x02 akan menjadi 0x82; 0x03 akan tetap 0x03 dll.
Untuk melanjutkan sistem ini, ketika set karakter ASCII didefinisikan, hanya 00-7F yang ditugaskan karakter. (Masih hari ini, semua karakter yang diatur dalam kisaran 80-FF adalah non-standar)
Banyak router hari ini memasukkan parity check dan terjemahan byte ke dalam perangkat keras, memaksa komputer yang terpasang padanya untuk secara ketat menangani data 7-bit. Ini memaksa lampiran email (dan semua data lainnya, itulah sebabnya protokol HTTP & SMTP berbasis teks), untuk dikonversi menjadi format hanya teks.
Beberapa router bertahan hingga tahun 90-an. Saya sangat meragukan ada di antara mereka yang digunakan hari ini.
Dari http://en.wikipedia.org/wiki/Base64
Base64 merujuk pada penyandian transfer konten MIME tertentu. Ini juga digunakan sebagai istilah umum untuk skema pengkodean serupa yang mengkodekan data biner dengan memperlakukannya secara numerik dan menerjemahkannya ke dalam representasi basis 64. Pilihan basis tertentu adalah karena sejarah pengkodean set karakter: seseorang dapat memilih satu set 64 karakter yang merupakan bagian dari subset yang umum untuk sebagian besar pengkodean, dan juga dapat dicetak. Kombinasi ini membuat data tidak dapat dimodifikasi dalam transit melalui sistem, seperti email, yang biasanya tidak 8-bit bersih.
Base64 dapat digunakan dalam berbagai konteks:
- Evolusi dan Thunderbird menggunakan Base64 untuk mengaburkan kata sandi email [1]
- Base64 dapat digunakan untuk mengirim dan menyimpan teks yang mungkin menyebabkan tumbukan pembatas
Base64 sering digunakan sebagai jalan pintas yang cepat tetapi tidak aman untuk mengaburkan rahasia tanpa menimbulkan overhead manajemen kunci kriptografi
Spammer menggunakan Base64 untuk menghindari alat anti-spam dasar, yang sering tidak memecahkan kode Base64 dan karenanya tidak dapat mendeteksi kata kunci dalam pesan yang disandikan.
- Base64 digunakan untuk menyandikan string karakter dalam file LDIF
- Base64 kadang-kadang digunakan untuk menanamkan data biner dalam file XML, menggunakan sintaksis yang mirip dengan ...... misalnya bookmark Firefox.html.
- Base64 juga digunakan ketika berkomunikasi dengan perangkat cetak Tanda Tangan Fiskal pemerintah (biasanya, melalui port serial atau paralel) untuk meminimalkan keterlambatan saat mentransfer karakter tanda terima untuk ditandatangani.
- Base64 digunakan untuk menyandikan file biner seperti gambar dalam skrip, untuk menghindari tergantung pada file eksternal.
- Dapat digunakan untuk menanamkan data gambar mentah ke properti CSS seperti gambar latar.
Beberapa protokol transportasi hanya mengizinkan karakter alfanumerik untuk ditransmisikan. Bayangkan saja situasi di mana karakter kontrol digunakan untuk memicu tindakan khusus dan / atau yang hanya mendukung lebar bit terbatas per karakter. Base64 mengubah input apa pun menjadi pengkodean yang hanya menggunakan karakter alfanumerik +
,, /
dan =
sebagai karakter padding.
Penggunaan Base64 yang akan saya uraikan di sini agak meretas. Jadi, jika Anda tidak menyukai peretasan, jangan lanjutkan.
Saya mendapat masalah ketika saya menemukan bahwa utf8 MySQL tidak mendukung karakter unicode 4-byte karena menggunakan versi utf8 3-byte. Jadi apa yang saya lakukan untuk mendukung unicode 4-byte penuh melalui utf8 MySQL? Nah, base64 mengkodekan string ketika menyimpan ke dalam basis data dan base64 decode saat mengambil.
Karena encoding dan decoding base64 sangat cepat, hal di atas berfungsi dengan baik.
Anda memiliki poin-poin berikut untuk diperhatikan:
Pengkodean base64 menggunakan 33% lebih banyak penyimpanan
String yang disimpan dalam database tidak dapat dibaca manusia (Anda bisa menjualnya sebagai fitur yang string database menggunakan bentuk enkripsi dasar).
Anda dapat menggunakan metode di atas untuk mesin penyimpanan apa pun yang tidak mendukung unicode.
utf8
tipenya masih tiga-byte saja; jika Anda menginginkan yang asli, gunakan utf8mb4
. Retas yang bagus, tetapi tidak perlu lagi.
Ini digunakan untuk mengkonversi data biner acak ke teks ASCII.
Misalnya, lampiran email dikirimkan dengan cara ini.
Saya menggunakannya dalam arti praktis ketika kita mentransfer objek biner besar (gambar) melalui layanan web. Jadi ketika saya menguji layanan web C # menggunakan skrip python, objek biner dapat dibuat ulang dengan sedikit sihir.
[Dengan python]
import base64
imageAsBytes = base64.b64decode( dataFromWS )
“Skema pengkodean Base64 umumnya digunakan ketika ada kebutuhan untuk menyandikan data biner yang perlu disimpan dan ditransfer melalui media yang dirancang untuk menangani data tekstual. Ini untuk memastikan bahwa data tetap utuh tanpa modifikasi selama transportasi ”(Wiki, 2017)
Contohnya bisa sebagai berikut: Anda memiliki layanan web yang hanya menerima karakter ASCII. Anda ingin menyimpan dan kemudian mentransfer data pengguna ke beberapa lokasi lain (API) tetapi penerima ingin menerima data yang tidak tersentuh. Base64 untuk itu. . . Satu-satunya downside adalah bahwa pengkodean base64 akan membutuhkan sekitar 33% lebih banyak ruang daripada string biasa.
Contoh lain :: uenc = url encoded = aHR0cDovL2xvYy5tYWdlbnRvLmNvbS9hc2ljcy1tZW4tcy1nZWwta2F5YW5vLXhpaS5odG1s = http://loc.querytip.com/asics-men-s-gel-kayano-xii.html .
Seperti yang Anda lihat, kami tidak dapat memasukkan char "/" di URL jika kami ingin mengirim URL yang terakhir dikunjungi sebagai parameter karena kami akan melanggar aturan atribut / nilai untuk "MOD rewrite" - GET parameter.
Contoh lengkapnya adalah: " http://loc.querytip.com/checkout/cart/add/uenc/http://loc.magento.com/asics-men-s-gel-kayano-xii.html/product / 93 / "
Sebagian besar, saya telah melihatnya digunakan untuk menyandikan data biner dalam konteks yang hanya dapat menangani ascii - atau set karakter sederhana.
Untuk sedikit memperluas apa yang dikatakan Brad: banyak mekanisme transportasi untuk email dan Usenet dan cara lain untuk memindahkan data tidak "8 bit clean", yang berarti bahwa karakter di luar set karakter ascii standar mungkin hancur dalam perjalanan - misalnya, 0x0D mungkin terlihat sebagai carriage return, dan berubah menjadi carriage return dan line feed. Base 64 memetakan semua karakter biner menjadi beberapa ascii standar huruf dan angka dan tanda baca sehingga mereka tidak akan hancur dengan cara ini.
Base64
Base64 adalah istilah umum untuk sejumlah skema pengkodean serupa yang menyandikan data biner dengan memperlakukannya secara numerik dan menerjemahkannya ke dalam representasi basis 64. Istilah Base64 berasal dari penyandian transfer konten MIME tertentu.
Skema pengkodean Base64 umumnya digunakan ketika ada kebutuhan untuk menyandikan data biner yang perlu disimpan dan ditransfer melalui media yang dirancang untuk menangani data tekstual. Ini untuk memastikan bahwa data tetap utuh tanpa modifikasi selama transportasi. Base64 digunakan secara umum dalam sejumlah aplikasi termasuk email melalui MIME, dan menyimpan data kompleks dalam XML.
Base64 dapat digunakan untuk banyak tujuan.
Alasan utama adalah untuk mengkonversi data biner menjadi sesuatu yang bisa dilewati.
Saya terkadang menggunakannya untuk meneruskan data JSON dari satu situs ke situs lainnya, menyimpan informasi dalam cookie tentang pengguna.
Catatan: Anda "bisa" menggunakannya untuk enkripsi - Saya tidak melihat mengapa orang mengatakan Anda tidak bisa, dan itu bukan enkripsi, meskipun itu akan mudah dipecahkan dan disukai. Enkripsi berarti tidak lebih dari mengubah satu string data ke string data lain yang dapat didekripsi nanti atau tidak, dan itulah yang dilakukan base64.
Satu digit heksadesimal adalah satu gigitan (4 bit). Dua camilan menghasilkan 8 bit yang juga disebut 1 byte.
MD5 menghasilkan output 128-bit yang direpresentasikan menggunakan urutan 32 digit heksadesimal, yang pada gilirannya adalah 32 * 4 = 128 bit. 128 bit menghasilkan 16 byte (karena 1 byte adalah 8 bit).
Setiap karakter Base64 mengkodekan 6 bit (kecuali karakter non-pad terakhir yang dapat menyandikan 2, 4 atau 6 bit; dan karakter pad akhir, jika ada). Oleh karena itu, per pengkodean Base64, hash 128-bit membutuhkan setidaknya ⌈128 / 6⌉ = 22 karakter, ditambah pad jika ada.
Menggunakan base64, kita dapat menghasilkan output yang dikodekan dari panjang yang kita inginkan (6, 8, atau 10). Jika kita memilih untuk memutuskan output 8 char panjang, itu hanya menempati 8 byte sedangkan itu menempati 16 byte untuk 128-bit hash output.
Jadi, selain keamanan, encoding base64 juga digunakan untuk mengurangi ruang yang dikonsumsi.