Untuk apa pengkodean base 64?

782

Saya pernah mendengar orang berbicara tentang "basis 64 encoding" di sana-sini. Untuk apa ini digunakan?

MrDatabase
sumber
1
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.

Dave Markle
sumber
104
(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.

Jon Skeet
sumber
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.
Jon Skeet
1
@ still_dreaming_1 PHP memanggil mereka binary strings. (sumber) php.net/manual/en/function.pack.php
Cholthi Paul Ttiopic
123

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.

http://en.wikipedia.org/wiki/Base64

Brad Wilson
sumber
116

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:

  1. 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.
  2. 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.

Makan Goral
sumber
10
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.

Sertifikat

sertifikat x509 dalam format PEM adalah basis 64 disandikan. http://how2ssl.com/articles/working_with_pem_files/

Despertar
sumber
4
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

masukkan deskripsi gambar di sini

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”

masukkan deskripsi gambar di sini

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 ==”

Rajesh Prajapati
sumber
5
ini benar-benar penjelasan yang bagus
maheshmnj
28

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.

James Curran
sumber
2
Ini adalah titik diskusi yang sangat baik dan pelajaran sejarah yang menarik, terima kasih.
Dan Bechard
26

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.
warren
sumber
11

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.

Konrad Rudolph
sumber
9

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.

Basil Musa
sumber
6
"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.

Bisa Berk Güder
sumber
7

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 )
Andrew Cox
sumber
1
Apakah data bergerak lebih cepat?
FelipeM
1
@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.

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 / "

jmr333
sumber
4

Sebagian besar, saya telah melihatnya digunakan untuk menyandikan data biner dalam konteks yang hanya dapat menangani ascii - atau set karakter sederhana.

Eric Tuttleman
sumber
3

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.

Paul Tomblin
sumber
2

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.

mugil k
sumber
0

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.

Jody Fitzpatrick
sumber
2
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.

Jainabhi
sumber