Dari manual untuk base64_encode () : "Pengkodean ini dirancang untuk membuat data biner bertahan dari transpor melalui lapisan transport yang tidak bersih 8-bit, seperti badan mail."
still_dreaming_1
Jawaban:
941
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.
(Secara teori Anda bisa melakukan pengkodean basis-80 atau yang serupa, tetapi akan jauh lebih sulit. Kekuatan dua adalah basis alami untuk biner.)
Jon Skeet
13
@Yokees: Tidak ada jaminan, mereka hanya karakter yang hampir selalu aman. Inilah sebabnya mengapa ada beberapa bentuk Base-64 ( en.wikipedia.org/wiki/Base-64 ).
8
Apakah itu berarti bahwa semua data jenis jaringan yang lewat harus menggunakan semacam pengkodean?
Tanner Summers
6
Tetapi mengapa metode base64 digunakan untuk menyandikan data string? misal dalam fungsi atav javascript Apakah ada artinya server untuk menyandikan file json ke format base64? Karakter khusus dapat menjadi use case tetapi mengapa tidak utf8 dalam kasus itu, apakah mereka sama? Sumber daya lebih lanjut tentang itu akan sangat dihargai, terima kasih.
partizanos
4
Daftar setidaknya beberapa protokol yang akan gagal akan bagus untuk dimiliki jika seseorang tahu.
Tadej
202
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.
Dalam bahasa seperti php, akankah data biner berasal. Kami hampir selalu bekerja dengan data string yang berupa teks.
Cholthi Paul Ttiopic
3
@CholthiPaulTtiopic: Hasil enkripsi atau kompresi, atau suara / gambar / video.
Jon Skeet
1
@CholthiPaulTtiopic: Saya khawatir saya tidak tahu apa yang Anda maksud dengan "bagaimana dengan penyimpanan" tetapi pada titik ini saya pikir kita agak di luar topik.
Jon Skeet
2
@CholthiPaulTtiopic: Saya akan sangat menghindari berpikir dalam hal "string binary". Data biner harus diperlakukan sebagai data biner, dan tidak diperlakukan sebagai teks. Saya telah melihat ratusan - mungkin ribuan - pertanyaan tentang SO yang pada dasarnya bermuara pada orang-orang yang tidak cukup memperhatikan perbedaan ini.
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:
Desimal: menyimpan nilai desimal setiap byte sebagai tiga angka: 045 112 101 037 dll. Di mana setiap byte diwakili oleh 3 byte. Data kembung tiga kali lipat.
Heksadesimal: menyimpan byte sebagai pasangan hex: AC 47 0D 1A dll. Di mana setiap byte diwakili oleh 2 byte. Data menggembung dua kali lipat.
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.
Apakah saya mengerti dengan benar, bahwa 64 adalah pilihan terbaik karena itu adalah kekuatan tertinggi dari dua yang dapat dikonversi menjadi karakter ASCII yang dapat dicetak (ada 95 di antaranya)?
voho
Jika dalam kedua kasus mereka 24 bit, bukankah 1: 1 kembung? Atau Ketika Anda mengatakan 4 karakter yang merentang 6 bit, maksud Anda sebenarnya ada 8 bit per karakter tetapi dua yang pertama berisi 0s?
David Klempfner
1
@Backwards_Dave Setiap 6 bit diekspresikan dalam 8 bit. Jadi kembungnya 8: 6, atau 4: 3.
Ates Goral
82
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.
Sebenarnya lebih mudah, pemrosesan, untuk menyimpan byte sebagai byte dalam banyak kasus. Bahkan dalam database, dan terutama dalam file (jika catatan dengan panjang tetap digunakan, atau byte adalah satu-satunya konten). Base64 biasanya digunakan ketika byte tersebut dimaksudkan untuk ditransmisikan di suatu tempat, terutama melalui saluran yang mungkin memotong bit atau menginterpretasikan beberapa byte sebagai kode kontrol.
cao
Saya belum pernah melihat hash ditulis sebagai bilangan bulat 8 bit yang tidak ditandatangani, 0,1,255,36 ... dan menampilkannya dengan UTF-8 atau pengkodean lainnya tidak masuk akal, bagaimana lagi Anda menampilkannya selain dengan base64? Kunci enkripsi dan data terenkripsi sering disimpan dalam file konfigurasi dan XML di mana Anda tidak dapat menyimpan byte mentah. Saya setuju jika Anda dapat menyimpannya sebagai byte mentah lalu dengan segala cara, tetapi base64 adalah untuk situasi-situasi ketika Anda tidak bisa. Ada banyak kegunaan base64 di luar transmisi. Ini hanyalah dua skenario umum di mana Anda akan melihatnya.
Despertar
1
Anda akan menampilkan hash sebagai hex, bukan desimal. Untuk hash, itu sebenarnya jauh lebih umum daripada base64.
cHao
@ cHao Ya, ini juga biasa. Digit heks dapat mewakili data biner apa pun, tetapi basis 64 memiliki keuntungan karena menggunakan lebih banyak ruang karena menggunakan lebih banyak karakter.
Despertar
45
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.
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.
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.
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.
"Anda bisa menjualnya sebagai fitur yang menggunakan string basis data enkripsi dasar" Saya suka gaya Anda: D
Ercan
8
"Anda bisa menjual itu sebagai fitur yang menggunakan basis data string menggunakan bentuk enkripsi" apa yang dikatakan: D
Alex
1
bentuk dasar enkripsi terhadap siapa pun yang tidak memiliki algoritma decode base64
rofl
1
@ Alex Sama sekali bukan "hal yang mengerikan untuk dikatakan". Data sensitif tingkat kedua boleh saja dikodekan base64 agar tidak dapat dibaca oleh administrator db. Tidak selalu perlu memiliki tingkat enkripsi tertinggi untuk setiap bagian data. Misalnya, jika Anda ingin menyembunyikan "komentar" dari administrator db, maka base64 cocok untuk pekerjaan itu. Gratcias!
Basil Musa
1
Perlu disebutkan bahwa MySQL sekarang memiliki dukungan untuk semua Unicode, meskipun untuk tujuan kompatibilitas mundur, utf8tipenya masih tiga-byte saja; jika Anda menginginkan yang asli, gunakan utf8mb4. Retas yang bagus, tetapi tidak perlu lagi.
TRiG
7
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.
@FelipeM lebih lambat, tidak lebih cepat. Base64 memiliki overhead 33% (untuk harga keamanan.)
Juraj
6
“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.
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.
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 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.
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.
Anda menafsirkan definisi "enkripsi" jauh terlalu harfiah. Kata itu telah berkembang menjadi sesuatu yang sedikit lebih spesifik daripada asal-usulnya.
Dan Bechard
0
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.
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.
sumber
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.
sumber
binary strings
. (sumber) php.net/manual/en/function.pack.phpPengkodean basis-64 adalah cara mengambil data biner dan mengubahnya menjadi teks sehingga lebih mudah dikirim dalam hal-hal seperti email dan data formulir HTML.
http://en.wikipedia.org/wiki/Base64
sumber
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.
sumber
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/
sumber
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 ==”
sumber
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.
sumber
Dari http://en.wikipedia.org/wiki/Base64
sumber
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.sumber
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.
sumber
utf8
tipenya masih tiga-byte saja; jika Anda menginginkan yang asli, gunakanutf8mb4
. Retas yang bagus, tetapi tidak perlu lagi.Ini digunakan untuk mengkonversi data biner acak ke teks ASCII.
Misalnya, lampiran email dikirimkan dengan cara ini.
sumber
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]
sumber
“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 / "
sumber
Sebagian besar, saya telah melihatnya digunakan untuk menyandikan data biner dalam konteks yang hanya dapat menangani ascii - atau set karakter sederhana.
sumber
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.
sumber
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.
sumber
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.
sumber
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.
sumber