การเข้ารหัสฐาน 64 ใช้สำหรับทำอะไร


782

ฉันได้ยินคนพูดถึง "การเข้ารหัสฐาน 64" ที่นี่และที่นั่น ใช้ทำอะไร?


1
จากคู่มือสำหรับbase64_encode () : "การเข้ารหัสนี้ได้รับการออกแบบมาเพื่อให้ข้อมูลไบนารีอยู่รอดผ่านการส่งผ่านเลเยอร์การขนส่งที่ไม่ได้รับการทำความสะอาด 8 บิตเช่นเนื้อจดหมาย"
still_dreaming_1

คำตอบ:


940

เมื่อคุณมีข้อมูลไบนารีบางอย่างที่คุณต้องการจัดส่งผ่านเครือข่ายโดยทั่วไปคุณจะไม่ทำเพียงแค่สตรีมบิตและไบต์ผ่านสายในรูปแบบ raw ทำไม? เพราะสื่อบางอย่างถูกสร้างขึ้นเพื่อการสตรีมข้อความ คุณไม่มีทางรู้ได้ - โปรโตคอลบางอย่างอาจตีความข้อมูลไบนารีของคุณเป็นอักขระควบคุม (เช่นโมเด็ม) หรือข้อมูลไบนารีของคุณอาจเมาเพราะโปรโตคอลพื้นฐานอาจคิดว่าคุณได้ป้อนชุดอักขระพิเศษ (เช่นวิธี FTP แปลบรรทัด ตอนจบ)

เพื่อให้ได้สิ่งนี้ผู้คนเข้ารหัสข้อมูลไบนารี่เป็นตัวละคร Base64 เป็นหนึ่งในการเข้ารหัสประเภทนี้

ทำไมต้อง 64
เนื่องจากโดยทั่วไปคุณสามารถพึ่งพา 64 ตัวอักษรเดียวกันกับที่มีอยู่ในชุดอักขระจำนวนมากและคุณสามารถมั่นใจได้อย่างมีเหตุผลว่าข้อมูลของคุณจะจบลงที่อีกด้านหนึ่งของสายที่ไม่ถูกขัดจังหวะ


104
(ในทางทฤษฎีคุณสามารถทำการเข้ารหัสแบบ base-80 หรือบางอย่างที่คล้ายกัน แต่มันจะยากขึ้นอย่างมากพลังของทั้งสองเป็นฐานธรรมชาติสำหรับไบนารี)
Jon Skeet

13
@ yokees: ไม่มีการรับประกันพวกเขาเป็นเพียงตัวละครที่เกือบจะปลอดภัยเสมอ นี่คือเหตุผลที่มีหลายรูปแบบของ Base-64 ( en.wikipedia.org/wiki/Base-64 )

8
นั่นหมายความว่าการส่งผ่านข้อมูลประเภทเครือข่ายทั้งหมดควรใช้การเข้ารหัสบางประเภทหรือไม่?
แทนเนอร์ซัมเมอร์ส

6
แต่ทำไม base64 จึงถูกใช้เพื่อเข้ารหัสข้อมูลสตริง? เช่นในฟังก์ชั่น javascript atob มีความหมายว่าเซิร์ฟเวอร์เข้ารหัสไฟล์ json เป็นรูปแบบ base64 หรือไม่? อักขระพิเศษอาจเป็นกรณีใช้งาน แต่ทำไมไม่ใช้ utf8 ในกรณีนั้นพวกเขามีความสมดุลหรือไม่? ทรัพยากรเพิ่มเติมใด ๆ เกี่ยวกับที่จะได้รับการชื่นชมอย่างมากขอบคุณ
partizanos

4
รายการของโพรโทคอลบางอย่างที่จะล้มเหลวจะดีถ้ามีใครรู้
Tadej

202

มันเป็นวิธีการเข้ารหัสข้อมูลไบนารีโดยพลการในข้อความ ASCII ใช้เวลา 4 ตัวอักษรต่อข้อมูล 3 ไบต์รวมทั้งอาจมีช่องว่างภายในเล็กน้อย

เป็นหลักแต่ละ 6 บิตของการป้อนข้อมูลจะถูกเข้ารหัสในตัวอักษร 64 ตัวอักษร ตัวอักษร "มาตรฐาน" ใช้ AZ, az, 0-9 และ + และ /, กับ = เป็นอักขระตัวรอง มีตัวแปรที่ปลอดภัยต่อ URL

Wikipediaเป็นแหล่งข้อมูลที่ดีพอสมควร


ใน langange เช่น php ข้อมูลไบนารีจะมาจากไหน เรามักจะทำงานกับข้อมูลสตริงซึ่งเป็นข้อความ
Cholthi Paul Ttiopic

3
@CholthiPaulTtiopic: ผลลัพธ์ของการเข้ารหัสหรือการบีบอัดหรือเสียง / ภาพ / วิดีโอ
Jon Skeet

1
@ColthiPaulTtiopic: ฉันเกรงว่าฉันไม่รู้ว่าคุณหมายถึงอะไร "เกี่ยวกับที่เก็บข้อมูล" แต่ ณ จุดนี้ฉันคิดว่าเราค่อนข้างไม่เข้าใจ
Jon Skeet

2
@ColthiPaulTtiopic: ฉันควรหลีกเลี่ยงการคิดในแง่ของ "string binary" ข้อมูลไบนารีควรถือเป็นข้อมูลไบนารีและไม่ถือว่าเป็นข้อความ ฉันได้เห็นคำถามหลายร้อยคำถามที่ว่าด้วย SO ซึ่งโดยทั่วไปแล้วผู้คนจะไม่ใส่ใจในความแตกต่างนี้มากพอ
Jon Skeet

1
@ still_dreaming_1 PHP binary stringsเรียกพวกเขา (ที่มา) php.net/manual/en/function.pack.php
Cholthi Paul Ttiopic

123

การเข้ารหัส Base-64 เป็นวิธีหนึ่งในการรับข้อมูลไบนารีและเปลี่ยนเป็นข้อความเพื่อให้สามารถส่งได้ง่ายขึ้นในสิ่งต่าง ๆ เช่นอีเมลและข้อมูลฟอร์ม HTML

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


116

มันเป็นการเข้ารหัสข้อความของข้อมูลไบนารีที่ข้อความผลลัพธ์ไม่มีอะไรนอกจากตัวอักษรตัวเลขและสัญลักษณ์ "+", "/" และ "=" มันเป็นวิธีที่สะดวกในการจัดเก็บ / ส่งข้อมูลไบนารีผ่านสื่อที่ใช้สำหรับข้อมูลที่เป็นข้อความโดยเฉพาะ

แต่ทำไม Base-64 ทางเลือกสองทางสำหรับการแปลงข้อมูลไบนารีเป็นข้อความที่คิดได้ทันทีคือ:

  1. ทศนิยม: เก็บค่าทศนิยมของแต่ละไบต์เป็นตัวเลขสามตัว: 045 112 101 037 ฯลฯ โดยที่แต่ละไบต์นั้นแทนด้วย 3 ไบต์ ข้อมูลขยายตัวสามเท่า
  2. เลขฐานสิบหก: เก็บไบต์เป็นคู่ฐานสิบหก: AC 47 0D 1A ฯลฯ โดยที่แต่ละไบต์แทนด้วย 2 ไบต์ ข้อมูลขยายตัวสองเท่า

Base-64 แมป 3 ไบต์ (8 x 3 = 24 บิต) ใน 4 ตัวอักษรที่ยาว 6-bits (6 x 4 = 24 บิต) ผลลัพธ์ดูเหมือน "TWFuIGlzIGRpc3Rpb ... " ดังนั้น bloating จึงเป็นเพียง 4/3 = 1.3333333 เท่าของแท้


10
ฉันเข้าใจถูกต้องหรือไม่ว่า 64 เป็นตัวเลือกที่ดีที่สุดเนื่องจากเป็นพลังสูงสุดของทั้งสองที่สามารถแปลงเป็นอักขระ ASCII ที่พิมพ์ได้ (มี 95 ตัว)
voho

ถ้าในทั้งสองกรณีมันมี 24 บิตแล้ว bloating 1: 1 ไม่ใช่เหรอ? หรือเมื่อคุณพูดว่าตัวละคร 4 ตัวที่มีความยาว 6 บิตคุณหมายถึงว่ามี 8 บิตต่อตัวอักษร แต่สองตัวแรกเป็นเบาะ 0s หรือไม่?
David Klempfner

1
@Backwards_Dave แต่ละ 6 บิตแสดงเป็น 8 บิต ดังนั้น bloating คือ 8: 6 หรือ 4: 3
Ates Goral

82

นอกเหนือจากสิ่งที่กล่าวไปแล้วการใช้งานทั่วไปสองอย่างที่ไม่ได้อยู่ในรายการคือ

hashes:

แฮชเป็นฟังก์ชันทางเดียวที่แปลงบล็อกของไบต์เป็นบล็อกขนาดอื่นที่มีขนาดคงที่เช่น 128 บิตหรือ 256 บิต (SHA / MD5) การแปลงไบต์ที่เป็นผลลัพธ์ให้เป็น Base64 ทำให้ง่ายยิ่งขึ้นในการแสดงแฮชโดยเฉพาะเมื่อคุณเปรียบเทียบการตรวจสอบความสมบูรณ์ มักพบเห็นแฮชใน Base64 ซึ่งหลายคนเข้าใจผิดว่า Base64 นั้นเป็นแฮช

Cryptography:

เนื่องจากคีย์การเข้ารหัสไม่จำเป็นต้องเป็นข้อความ แต่เป็นไบต์ที่บางครั้งจำเป็นต้องเก็บไว้ในไฟล์หรือฐานข้อมูลซึ่ง Base64 มีประโยชน์ เหมือนกับไบต์ที่เข้ารหัสที่ได้

โปรดทราบว่าแม้ว่า Base64 มักใช้ในการเข้ารหัสไม่ใช่กลไกความปลอดภัย ทุกคนสามารถแปลงสตริง Base64 กลับไปเป็นไบต์ดั้งเดิมดังนั้นจึงไม่ควรใช้เป็นวิธีในการปกป้องข้อมูลเฉพาะรูปแบบที่จะแสดงหรือจัดเก็บไบต์ดิบได้ง่ายขึ้น

ใบรับรอง

ใบรับรอง x509 ในรูปแบบ PEM ถูกเข้ารหัสพื้นฐาน 64 http://how2ssl.com/articles/working_with_pem_files/


4
จริงๆแล้วมันง่ายกว่าในการประมวลผลเพื่อเก็บไบต์เป็นไบต์ในหลายกรณี แม้ในฐานข้อมูลและโดยเฉพาะอย่างยิ่งในไฟล์ (หากมีการใช้บันทึกความยาวคงที่หรือไบต์เป็นเนื้อหาเท่านั้น) โดยทั่วไปแล้ว Base64 จะถูกใช้เมื่อมีการส่งผ่านไบต์เหล่านั้นไปยังที่ใดที่หนึ่งโดยเฉพาะอย่างยิ่งผ่านช่องทางที่อาจตัดบิตหรือตีความบางส่วนของไบต์เป็นรหัสควบคุม
cHao

ฉันไม่เคยเห็นแฮชเขียนเป็นจำนวนเต็ม 8 บิตที่ไม่ได้ลงนาม 0,1,255,36 ... และแสดงด้วย UTF-8 หรือการเข้ารหัสอื่น ๆ จะไม่สมเหตุสมผลคุณจะแสดงอื่นนอกเหนือจาก base64 อย่างไร คีย์การเข้ารหัสและข้อมูลที่เข้ารหัสมักจะถูกจัดเก็บไว้ในแฟ้มการกำหนดค่าและ XML ซึ่งคุณไม่สามารถจัดเก็บไบต์ดิบ ฉันเห็นด้วยถ้าคุณสามารถเก็บมันเป็นไบต์ดิบแล้วโดยวิธีการทั้งหมด แต่ base64 สำหรับสถานการณ์เหล่านั้นเมื่อคุณไม่สามารถ มีประโยชน์หลายอย่างของ base64 เกินกว่าการส่งสัญญาณ เหล่านี้เป็นเพียงสองสถานการณ์ทั่วไปที่คุณจะเห็นมัน
Despertar

1
คุณต้องการแสดงแฮชเป็นเลขฐานสิบหกไม่ใช่ทศนิยม สำหรับแฮชนั้นเป็นเรื่องธรรมดามากกว่าฐาน 64
cHao

@cHao ใช่นี่เป็นเรื่องธรรมดา เลขฐานสิบหกสามารถเป็นตัวแทนของข้อมูลไบนารีใด ๆ แต่ฐาน 64 มีข้อได้เปรียบของการใช้พื้นที่น้อยลงมากเนื่องจากใช้อักขระมากขึ้น
Despertar

45

หลายปีที่ผ่านมาเมื่อมีการเปิดใช้งานฟังก์ชันการส่งจดหมายดังนั้นเมื่อใช้เวลานานจึงจำเป็นต้องมีไฟล์แนบเช่นรูปภาพและสื่อ (เสียงวิดีโอเป็นต้น) เมื่อสิ่งที่แนบเหล่านี้ถูกส่งผ่านอินเทอร์เน็ต (ซึ่งโดยทั่วไปจะอยู่ในรูปแบบของข้อมูลไบนารี) ความน่าจะเป็นของข้อมูลไบนารีที่ได้รับความเสียหายสูงในรูปแบบดิบ ดังนั้นเพื่อจัดการกับปัญหานี้ BASE64 จึงเข้ามา

ปัญหาเกี่ยวกับข้อมูลไบนารีคือมันมีตัวละคร null ซึ่งในบางภาษาเช่น C, C ++ หมายถึงจุดสิ้นสุดของสตริงอักขระดังนั้นการส่งข้อมูลไบนารีในรูปแบบดิบที่มี NULL ไบต์จะหยุดไฟล์จากการอ่านอย่างเต็มที่และนำไปสู่ข้อมูลที่เสียหาย

ตัวอย่างเช่น :

ใน C และ C ++ อักขระ "null" นี้แสดงจุดสิ้นสุดของสตริง ดังนั้น "HELLO" จึงถูกจัดเก็บไว้เช่นนี้:

สวัสดี

72 69 76 76 79 00

00 บอกว่า "หยุดที่นี่"

ทีนี้มาดูกันว่าการเข้ารหัส BASE64 ทำงานอย่างไร

จุดที่ควรสังเกต: ความยาวของสตริงควรเป็นหลายเท่าของ 3

ตัวอย่างที่ 1:

สตริงที่จะเข้ารหัส:“ เอซ”, ความยาว = 3

1) แปลงอักขระแต่ละตัวให้เป็นทศนิยม

a = 97, c = 99, e = 101

ป้อนคำอธิบายรูปภาพที่นี่

2) เปลี่ยนทศนิยมแต่ละทศนิยมเป็น 8 บิต

97 = 01100001, 99 = 01100011, 101 = 01100101

รวมกัน: 01100001 01100011 01100101

3) แยกเป็นกลุ่ม 6 บิต

011000 010110 001101 100101

4) คำนวณเลขฐานสองเป็นทศนิยม

011000 = 24, 010110 = 22, 001101 = 13, 100101 = 37

5) แปลงอักขระทศนิยมให้เป็น base64 โดยใช้แผนภูมิ base64

24 = Y, 22 = W, 13 = N, 37 = l

“ ace” =>“ YWNl”

ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่างที่ 2:

สตริงที่จะเข้ารหัส:“ abcd” ความยาว = 4, มันไม่ได้เป็นหลายเท่าของ 3 ดังนั้นเพื่อให้ความยาวสตริงหลายเท่าของ 3 เราต้องเพิ่มการเติม 2 บิตเพื่อให้ความยาว = 6. บิตการแพ็ดจะแสดงด้วยเครื่องหมาย“ =”

ข้อสังเกต: บิต padding หนึ่งเท่ากับสองศูนย์ 00 ดังนั้นสองบิต padding เท่ากับสี่ศูนย์ 0000

ดังนั้นให้เริ่มกระบวนการ: -

1) แปลงอักขระแต่ละตัวให้เป็นทศนิยม

a = 97, b = 98, c = 99, d = 100

2) เปลี่ยนทศนิยมแต่ละทศนิยมเป็น 8 บิต

97 = 01100001, 98 = 01100010, 99 = 01100011, 100 = 01100100

3) แยกเป็นกลุ่ม 6 บิต

011000, 010110, 001001, 100011, 011001, 00

ดังนั้น 6-bit สุดท้ายจึงไม่สมบูรณ์ดังนั้นเราจึงใส่ padding สองบิตซึ่งเท่ากับสี่ศูนย์“ 0000”

011000, 010110, 001001, 100011, 011001, 000000 ==

ตอนนี้มันเท่ากัน เครื่องหมายเท่ากับสองที่ท้ายแสดงว่ามีการเพิ่ม 4 ศูนย์ (ช่วยในการถอดรหัส)

4) คำนวณเลขฐานสองเป็นทศนิยม

011000 = 24, 010110 = 22, 001001 = 9, 100011 = 35, 011001 = 25, 000000 = 0 ==

5) แปลงอักขระทศนิยมให้เป็น base64 โดยใช้แผนภูมิ base64

24 = Y, 22 = W, 9 = j, 35 = j, 25 = Z, 0 = A ==

“ abcd” =>“ YWJjZA ==”


5
นี่เป็นคำอธิบายที่ดีจริงๆ
maheshmnj

28

ในยุคแรก ๆ ของคอมพิวเตอร์เมื่อการสื่อสารระหว่างสายโทรศัพท์ไม่น่าเชื่อถือเป็นพิเศษวิธีการตรวจสอบความถูกต้องของข้อมูลที่รวดเร็วและสกปรกก็คือ "bit parity" ในวิธีนี้ทุกไบต์ที่ส่งจะมีข้อมูล 7 บิตและที่ 8 จะเป็น 1 หรือ 0 เพื่อบังคับให้จำนวนทั้งหมด 1 บิตในไบต์จะเท่ากัน

ดังนั้น 0x01 จะถูกส่งเป็น 0x81 0x02 จะเป็น 0x82; 0x03 จะยังคงเป็น 0x03 เป็นต้น

เพื่อเพิ่มเติมระบบนี้เมื่อกำหนดชุดอักขระ ASCII จะมีการกำหนดอักขระเพียง 00-7F เท่านั้น (จนถึงทุกวันนี้ตัวละครทั้งหมดที่อยู่ในช่วง 80-FF นั้นไม่ได้มาตรฐาน)

เราเตอร์หลายคนในวันนี้ทำการตรวจสอบพาริตีและการแปลไบต์เป็นฮาร์ดแวร์บังคับให้คอมพิวเตอร์ที่เชื่อมต่อกับพวกเขาจัดการกับข้อมูล 7 บิตอย่างเคร่งครัด ไฟล์แนบอีเมลนี้บังคับ (และข้อมูลอื่น ๆ ทั้งหมดซึ่งเป็นสาเหตุที่โปรโตคอล HTTP และ SMTP เป็นข้อความ) จะถูกแปลงเป็นรูปแบบข้อความอย่างเดียว

เราเตอร์เพียงไม่กี่ตัวที่รอดชีวิตมาได้ในยุค 90 ฉันสงสัยอย่างรุนแรงว่าวันนี้พวกเขาจะใช้งาน


2
นี่เป็นจุดอภิปรายที่ยอดเยี่ยมและเป็นบทเรียนประวัติศาสตร์ที่น่าสนใจขอบคุณ
Dan Bechard

26

จากhttp://en.wikipedia.org/wiki/Base64

คำว่า Base64 หมายถึงการเข้ารหัสการถ่ายโอนเนื้อหา MIME ที่เฉพาะเจาะจง มันยังใช้เป็นคำทั่วไปสำหรับรูปแบบการเข้ารหัสใด ๆ ที่คล้ายกันที่เข้ารหัสข้อมูลไบนารี่โดยปฏิบัติกับตัวเลขและแปลเป็นฐาน 64 ตัวเลือกฐานเฉพาะนั้นเกิดจากประวัติของการเข้ารหัสชุดอักขระ: เราสามารถเลือกชุดของอักขระได้ 64 ตัวซึ่งเป็นส่วนหนึ่งของเซ็ตย่อยทั่วไปที่เข้ารหัสส่วนใหญ่และสามารถพิมพ์ได้ ชุดค่าผสมนี้ทำให้ข้อมูลไม่น่าจะถูกแก้ไขในระหว่างการขนส่งผ่านระบบเช่นอีเมลซึ่งโดยทั่วไปแล้วจะไม่ทำความสะอาด 8 บิต

Base64 สามารถใช้ได้ในหลากหลายบริบท:

  • Evolution และ Thunderbird ใช้ Base64 เพื่อทำให้รหัสผ่านอีเมล์แย่ลง [1]
  • Base64 สามารถใช้ในการส่งและเก็บข้อความที่อาจทำให้เกิดการขัดแย้งกันของตัวคั่น
  • Base64 มักใช้เป็นทางลัดที่รวดเร็ว แต่ไม่ปลอดภัยในการปิดบังความลับโดยไม่ทำให้เกิดค่าใช้จ่ายในการจัดการคีย์เข้ารหัส

  • ผู้ส่งอีเมลขยะใช้ Base64 เพื่อหลีกเลี่ยงเครื่องมือป้องกันสแปมขั้นพื้นฐานซึ่งมักจะไม่ถอดรหัส Base64 ดังนั้นจึงไม่สามารถตรวจจับคำหลักในข้อความที่เข้ารหัสได้

  • Base64 ใช้เพื่อเข้ารหัสสตริงอักขระในไฟล์ LDIF
  • Base64 บางครั้งใช้เพื่อฝังข้อมูลไบนารีในไฟล์ XML โดยใช้ไวยากรณ์คล้ายกับ ...... เช่น bookmarks.html ของ Firefox
  • Base64 ยังใช้เมื่อสื่อสารกับอุปกรณ์การพิมพ์ลายเซ็นทางการคลังของรัฐบาล (โดยทั่วไปผ่านพอร์ตอนุกรมหรือพอร์ตขนาน) เพื่อลดความล่าช้าเมื่อถ่ายโอนอักขระใบเสร็จรับเงินสำหรับการเซ็นชื่อ
  • Base64 ใช้ในการเข้ารหัสไฟล์ไบนารีเช่นรูปภาพภายในสคริปต์เพื่อหลีกเลี่ยงการพึ่งพาไฟล์ภายนอก
  • สามารถใช้เพื่อฝังข้อมูลภาพดิบลงในคุณสมบัติ CSS เช่นภาพพื้นหลัง

11

โปรโตคอลการขนส่งบางตัวอนุญาตให้ส่งตัวอักษรและตัวเลขได้เท่านั้น ลองนึกภาพสถานการณ์ที่มีการใช้อักขระควบคุมเพื่อกระตุ้นการทำงานพิเศษและ / หรือที่รองรับความกว้างบิตที่ จำกัด ต่อตัวละครเท่านั้น Base64แปลงอินพุตใด ๆ เป็นการเข้ารหัสที่ใช้อักขระตัวอักษรและตัวเลข+เท่านั้น/และ=เป็นอักขระการขยาย


8

การใช้งาน Base64 ฉันจะอธิบายที่นี่ค่อนข้างแฮ็ค ดังนั้นหากคุณไม่ชอบแฮ็กโปรดอย่าดำเนินการต่อไป

ฉันพบปัญหาเมื่อฉันค้นพบว่า utf8 ของ MySQL ไม่รองรับอักขระแบบ 4 ไบต์ unicode เนื่องจากมันใช้ utf8 เวอร์ชัน 3 ไบต์ ดังนั้นสิ่งที่ฉันทำเพื่อสนับสนุน Unicode 4 ไบต์เต็มรูปแบบเหนือ utf8 ของ MySQL? สตริง64เข้ารหัสดีเมื่อจัดเก็บลงในฐานข้อมูลและถอดรหัส base64 เมื่อดึงข้อมูล

เนื่องจากการเข้ารหัสและถอดรหัส base64 นั้นเร็วมาก

คุณมีประเด็นต่อไปนี้ที่ควรทราบ:

  • การเข้ารหัส Base64 ใช้พื้นที่เก็บข้อมูลเพิ่มขึ้น 33%

  • สตริงที่เก็บในฐานข้อมูลจะไม่สามารถอ่านได้โดยมนุษย์ (คุณสามารถขายได้ว่าเป็นคุณสมบัติที่สตริงฐานข้อมูลใช้รูปแบบการเข้ารหัสพื้นฐาน)

คุณสามารถใช้วิธีการด้านบนสำหรับเอนจินการจัดเก็บใด ๆ ที่ไม่รองรับยูนิโค้ด


6
"คุณสามารถขายได้ว่าเป็นคุณสมบัติที่สตริงฐานข้อมูลใช้รูปแบบการเข้ารหัสพื้นฐาน" ฉันชอบสไตล์ของคุณ: D
Ercan

7
"คุณสามารถขายได้ว่าเป็นคุณสมบัติที่สตริงฐานข้อมูลใช้รูปแบบการเข้ารหัสพื้นฐาน" เป็นสิ่งที่น่ากลัวที่จะพูด: D
Alex

1
รูปแบบพื้นฐานของการเข้ารหัสลับกับใครก็ตามที่ไม่มีอัลกอริทึมถอดรหัส base64
rofl

1
@ Alex ไม่ได้เป็น "สิ่งที่น่ากลัวที่จะพูด" ข้อมูลที่มีความละเอียดอ่อนระดับที่สองก็โอเคที่จะเข้ารหัส base64 เพื่อให้ผู้ดูแลฐานข้อมูลไม่สามารถอ่านได้ ไม่จำเป็นเสมอไปที่จะมีการเข้ารหัสระดับสูงสุดสำหรับข้อมูลทุกส่วน ตัวอย่างเช่นหากคุณต้องการซ่อน "ข้อคิดเห็น" จากผู้ดูแลระบบ db ดังนั้น base64 จะเหมาะสำหรับงาน Gratcias!
Basil Musa

1
เป็นมูลค่าการกล่าวขวัญว่าขณะนี้ MySQL มีการรองรับ Unicode ทั้งหมด แต่สำหรับจุดประสงค์ในการใช้งานร่วมกันได้ย้อนหลังutf8ประเภทของพวกเขายังคงเป็นสามไบต์เท่านั้น utf8mb4ถ้าคุณต้องการสิ่งที่จริงการใช้งาน แฮ็คที่ดี แต่ไม่จำเป็นอีกต่อไป
TRiG

7

มันใช้สำหรับการแปลงข้อมูลไบนารีโดยพลการเป็นข้อความ ASCII

ตัวอย่างเช่นสิ่งที่แนบมากับอีเมลจะถูกส่งด้วยวิธีนี้


7

ฉันใช้มันในทางปฏิบัติเมื่อเราถ่ายโอนวัตถุไบนารีขนาดใหญ่ (ภาพ) ผ่านบริการบนเว็บ ดังนั้นเมื่อฉันทดสอบบริการเว็บ C # โดยใช้สคริปต์ไพ ธ อนวัตถุไบนารีสามารถสร้างขึ้นใหม่ได้ด้วยเวทมนตร์เล็กน้อย

[ในหลาม]

import base64
imageAsBytes = base64.b64decode( dataFromWS )

1
ข้อมูลเดินทางเร็วขึ้นหรือไม่
FelipeM

6

“ รูปแบบการเข้ารหัส Base64 มักใช้เมื่อมีความจำเป็นในการเข้ารหัสข้อมูลไบนารีที่จำเป็นต้องจัดเก็บและถ่ายโอนผ่านสื่อที่ออกแบบมาเพื่อจัดการกับข้อมูลที่เป็นข้อความ นี่คือเพื่อให้แน่ใจว่าข้อมูลยังคงไม่เปลี่ยนแปลงระหว่างการขนส่ง” (Wiki, 2017)

ตัวอย่างอาจเป็นดังต่อไปนี้: คุณมีเว็บเซอร์วิสที่ยอมรับเฉพาะ ASCII chars คุณต้องการบันทึกแล้วโอนข้อมูลของผู้ใช้ไปยังตำแหน่งอื่น (API) แต่ผู้รับต้องการรับข้อมูลที่ไม่ถูกแตะต้อง Base64 สำหรับสิ่งนั้น . . ข้อเสียเพียงอย่างเดียวคือการเข้ารหัส base64 จะต้องการพื้นที่ว่างมากกว่าสตริงปกติประมาณ 33%

อีกตัวอย่างหนึ่ง :: uenc = เข้ารหัส URL = = aHR0cDovL2xvYy5tYWdlbnRvLmNvbS9hc2ljcy1tZW4tcy1nZWwta2F5YW5vLXhpaS5odG1s http://loc.querytip.com/asics-men-s-gel-kayano-xii.html

อย่างที่คุณเห็นเราไม่สามารถใส่อักขระ“ /” ใน URL หากเราต้องการส่ง URL ที่เยี่ยมชมล่าสุดเป็นพารามิเตอร์เพราะเราจะทำลายกฎแอตทริบิวต์ / ค่าสำหรับ“ MOD เขียนใหม่” - พารามิเตอร์ GET

ตัวอย่างเต็มรูปแบบจะเป็น:“ http://loc.querytip.com/checkout/cart/add/uenc/http://loc.magento.com/asics-men-s-gel-kayano-xii.html/product / 93 /


4

ส่วนใหญ่ฉันเคยเห็นมันใช้ในการเข้ารหัสข้อมูลไบนารีในบริบทที่สามารถจัดการกับ ASCII หรือชุดอักขระที่เรียบง่าย


3

หากต้องการขยายสิ่งที่แบรดพูด: กลไกการขนส่งจำนวนมากสำหรับอีเมลและ Usenet และวิธีการย้ายข้อมูลอื่น ๆ ไม่ใช่ "8 บิตที่สะอาด" ซึ่งหมายความว่าอักขระที่อยู่นอกชุดอักขระ ASCII มาตรฐานอาจมีปัญหาในการขนส่ง - ตัวอย่างเช่น 0x0D อาจถูกมองว่าเป็น carriage return และกลายเป็น carriage return และ line feed Base 64 ทำการแมปอักขระไบนารีทั้งหมดลงในตัวอักษรและตัวเลขมาตรฐาน ASCII หลายตัวและเครื่องหมายวรรคตอนเพื่อไม่ให้ถูกรบกวนด้วยวิธีนี้


2

Base64

Base64 เป็นคำทั่วไปสำหรับชุดรูปแบบการเข้ารหัสที่คล้ายกันจำนวนหนึ่งซึ่งเข้ารหัสข้อมูลแบบไบนารีโดยทำการคำนวณเป็นตัวเลขและแปลเป็นฐาน 64 คำ Base64 มาจากการเข้ารหัสการถ่ายโอนเนื้อหา MIME ที่ระบุ

รูปแบบการเข้ารหัส Base64 มักใช้เมื่อมีความจำเป็นในการเข้ารหัสข้อมูลไบนารีที่ต้องการจัดเก็บและถ่ายโอนผ่านสื่อที่ออกแบบมาเพื่อจัดการกับข้อมูลที่เป็นข้อความ นี่คือเพื่อให้แน่ใจว่าข้อมูลยังคงไม่เปลี่ยนแปลงโดยระหว่างการขนส่ง Base64 ใช้กันทั่วไปในแอปพลิเคชั่นจำนวนมากรวมถึงอีเมลผ่าน MIME และจัดเก็บข้อมูลที่ซับซ้อนใน XML


0

Base64 สามารถใช้งานได้หลายวัตถุประสงค์

เหตุผลหลักคือการแปลงข้อมูลไบนารีเป็นสิ่งที่ผ่านได้

บางครั้งฉันใช้มันเพื่อส่งผ่านข้อมูล JSON จากเว็บไซต์หนึ่งไปยังอีกไซต์หนึ่งเก็บข้อมูลในคุกกี้เกี่ยวกับผู้ใช้

หมายเหตุ: คุณ "สามารถ" ใช้สำหรับการเข้ารหัสได้ - ฉันไม่เห็นว่าทำไมคนอื่นบอกว่าคุณทำไม่ได้และนั่นไม่ใช่การเข้ารหัสแม้ว่ามันจะแตกง่ายและขมวดคิ้วอยู่ การเข้ารหัสหมายถึงไม่มีอะไรมากไปกว่าการแปลงสตริงข้อมูลหนึ่งไปเป็นสตริงข้อมูลอื่นที่สามารถถอดรหัสได้ในภายหลังหรือไม่และนั่นคือสิ่งที่ base64 ทำ


7
ความแตกต่างระหว่างการเข้ารหัสและการเข้ารหัส
Hawkeye Parker

2
คุณกำลังตีความคำจำกัดความของ "การเข้ารหัส" ที่ไกลเกินไป คำนี้ได้พัฒนาเป็นสิ่งที่มีความเฉพาะเจาะจงมากกว่าจุดกำเนิด
Dan Bechard

0

เลขฐานสิบหกหนึ่งหลักคือหนึ่ง nibble (4 บิต) สองไส้ทำ 8 บิตซึ่งเรียกว่า 1 ไบต์

MD5 สร้างเอาต์พุต 128- บิตซึ่งแสดงโดยใช้ลำดับเลขฐานสิบหก 32 หลักซึ่งจะเป็น 32 * 4 = 128 บิต 128 บิตทำ 16 ไบต์ (ตั้งแต่ 1 ไบต์คือ 8 บิต)

อักขระ Base64 แต่ละตัวเข้ารหัส 6 บิต (ยกเว้นอักขระที่ไม่ใช่แผ่นสุดท้ายซึ่งสามารถเข้ารหัส 2, 4 หรือ 6 บิตและอักขระแผ่นสุดท้ายหากมี) ดังนั้นตามการเข้ารหัส Base64 แฮชแบบ 128 บิตต้องการอย่างน้อย⌈128 / 6⌉ = 22 ตัวอักษรรวมทั้งแพดหากมี

ด้วย base64 เราสามารถสร้างเอาท์พุทที่เข้ารหัสตามความยาวที่ต้องการ (6, 8, หรือ 10) หากเราเลือกที่จะตัดสินใจเอาต์พุต 8 ถ่านแบบยาวมันจะใช้งานเพียง 8 ไบต์ในขณะที่มันใช้ 16 ไบต์สำหรับเอาต์พุตแฮช 128 บิต

นอกจากการรักษาความปลอดภัยแล้วการเข้ารหัส base64 ยังใช้เพื่อลดพื้นที่ที่ใช้ไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.