Base 64エンコーディングは何に使用されますか?
質問
「base 64エンコーディング」についての話を聞いたことがあります。あちこち。それは何のために使われますか?
解決
ネットワーク経由で出荷したいバイナリデータがある場合、通常はビットとバイトを生の形式でワイヤ上でストリーミングするだけでは行いません。どうして?一部のメディアはストリーミングテキスト用に作成されているためです。知らない-一部のプロトコルは、バイナリデータを制御文字(モデムなど)として解釈したり、基になるプロトコルが特殊な文字の組み合わせを入力したとFTPが行を変換する方法を考えるため、バイナリデータが台無しになる可能性がありますエンディング)。
これを回避するために、人々はバイナリデータを文字にエンコードします。 Base64は、これらのタイプのエンコーディングの1つです。
64を使用する理由
一般に、多くの文字セットに存在する同じ64文字に依存することができ、データが破損しないようにワイヤの反対側に到達することを合理的に確信できるためです。
他のヒント
これは基本的に、ASCIIテキストの任意のバイナリデータをエンコードする方法です。 3バイトのデータごとに4文字、最後に少しのパディングが必要になる場合があります。
基本的に、入力の各6ビットは64文字のアルファベットでエンコードされます。 「標準」アルファベットは、A〜Z、a〜z、0〜9、および+と/を使用し、=はパディング文字として使用します。 URLセーフな亜種があります。
ウィキペディアは、より多くの情報のかなり良い情報源です。
Base-64エンコーディングは、バイナリデータを取得してテキストに変換し、電子メールやHTMLフォームデータなどでより簡単に送信できるようにする方法です。
バイナリデータのテキストエンコードであり、結果のテキストには文字、数字、記号「+」、「/」のみが含まれます。および" ="。これは、テキストデータ専用に使用されるメディアを介してバイナリデータを保存/送信する便利な方法です。
しかし、なぜBase-64なのですか?すぐに思い浮かぶ、バイナリデータをテキストに変換する2つの選択肢は次のとおりです。
- Decimal:各バイトの10進値を3つの数値として格納します:045 112 101 037など。各バイトは3バイトで表されます。データは3倍に膨れ上がります。
- 16進数:バイトを16進数のペアとして保存します。AC47 0D 1Aなど。各バイトは2バイトで表されます。データは2倍に膨れ上がります。
Base-64は、6ビット(6 x 4 = 24ビット)にわたる4文字で3バイト(8 x 3 = 24ビット)をマップします。結果は「TWFuIGlzIGRpc3Rpb ...」のようになります。したがって、膨満感は元の4/3 = 1.3333333倍にすぎません。
既に述べられていることとは別に、リストされていない2つの非常に一般的な用途は次のとおりです
ハッシュ:
ハッシュは、バイトのブロックを128ビットや256ビット(SHA / MD5)などの固定サイズのバイトの別のブロックに変換する一方向の関数です。結果のバイトをBase64に変換すると、特に整合性のチェックサムを比較する場合に、ハッシュを表示するのがはるかに簡単になります。ハッシュはBase64で頻繁に見られるため、多くの人がBase64自体をハッシュと間違えています。
暗号化:
暗号化キーはテキストである必要はなく、生のバイトであるため、Base64が便利なファイルまたはデータベースに保存する必要がある場合があります。結果の暗号化されたバイトと同じ。
Base64は暗号化でよく使用されますが、セキュリティメカニズムではないことに注意してください。誰でもBase64文字列を元のバイトに戻すことができるため、生のバイトをより簡単に表示または保存するための形式としてのみ、データを保護する手段として使用しないでください。
証明書
PEM形式のx509証明書は、Base 64でエンコードされています。 http://how2ssl.com/articles/working_with_pem_files/
http://en.wikipedia.org/wiki/Base64
からBase64という用語は、特定のMIMEコンテンツ転送エンコードを指します。 同様のエンコードスキームの総称としても使用されます。 バイナリデータを数値的に処理し、それを ベース64表現。ベースの特定の選択は、 文字セットエンコーディングの履歴:64のセットを選択できます ほとんどのエンコーディングに共通するサブセットの一部である文字、 また、印刷可能。この組み合わせでは、データが存在しそうにない 電子メールなどのシステムを介して転送中に変更された 従来は8ビットクリーンではありません。
Base64はさまざまなコンテキストで使用できます:
- EvolutionとThunderbirdはBase64を使用して電子メールパスワードを難読化します[1]
- Base64を使用すると、区切り文字の衝突を引き起こす可能性のあるテキストを送信および保存できます
Base64は、暗号化キー管理のオーバーヘッドを招くことなく、秘密を隠蔽するための迅速かつ安全でないショートカットとしてよく使用されます
スパマーはBase64を使用して基本的なスパム対策ツールを回避します。これは、多くの場合Base64をデコードしないため、エンコードされたキーワードを検出できません。 メッセージ。
- Base64は、LDIFファイルの文字列をエンコードするために使用されます
- Base64は、......に類似した構文を使用して、バイナリデータをXMLファイルに埋め込むために時々使用されます。 Firefoxのbookmarks.html。
- Base64は、政府のFiscal Signature印刷デバイス(通常、シリアルまたはパラレルポート経由)と通信する際にも使用されます。 署名のためにレシート文字を転送するときの遅延を最小限に抑えます。
- Base64は、スクリプト内の画像などのバイナリファイルのエンコードに使用され、外部ファイルに依存しないようにします。
- 生の画像データをbackground-imageなどのCSSプロパティに埋め込むために使用できます。
コンピューターの初期の頃、電話回線のシステム間通信が特に信頼できなかったとき、迅速な&データの整合性を検証するダーティな方法が使用されました:「ビットパリティ」。この方法では、送信されるすべてのバイトは7ビットのデータを持ち、8番目は1または0で、バイト内の1ビットの合計数を強制的に偶数にします。
したがって0x01は0x81として送信されます。 0x02は0x82になります。 0x03は0x03などになります。
このシステムをさらに進めるために、ASCII文字セットが定義されたとき、00-7Fのみに文字が割り当てられました。 (今日でも、80-FFの範囲に設定されているすべての文字は非標準です)
今日の多くのルーターは、パリティチェックとバイト変換をハードウェアに入れ、それらに接続されたコンピューターが7ビットデータを厳密に処理することを強制しています。これにより、電子メールの添付ファイル(およびその他のすべてのデータ。これがHTTP& SMTPプロトコルがテキストベースである理由)を強制的にテキストのみの形式に変換します。
90年代まで生き残ったルーターはほとんどありません。それらのどれもが今日使用されていることを非常に疑います。
一部の輸送プロトコルでは、英数字のみを送信できます。制御文字を使用して特殊なアクションをトリガーしたり、文字ごとに限られたビット幅しかサポートしない状況を想像してください。 Base64 は、すべての入力を英数字 +
のみを使用するエンコーディングに変換します。 、 /
およびパディング文字としての =
。
ここで説明するBase64の使用法は、ややハックです。したがって、ハッキングが気に入らない場合は、続行しないでください。
MySQLのutf8は3バイトバージョンのutf8を使用しているため、4バイトのユニコード文字をサポートしていないことを発見したときに問題が発生しました。それでは、MySQLのutf8上で完全な4バイトUnicodeをサポートするために私がしたことは何ですか?さて、データベースに保存するときはbase64エンコード文字列を、取得するときはbase64デコードします。
base64のエンコードとデコードは非常に高速であるため、上記は完全に機能しました。
次の点に注意してください:
-
Base64エンコードは33%以上のストレージを使用します
-
データベースに保存された文字列は人間が読めるものではありません(データベース文字列が基本的な暗号化形式を使用する機能として販売できます)。
Unicodeをサポートしないストレージエンジンには上記の方法を使用できます。
任意のバイナリデータをASCIIテキストに変換するために使用されます。
たとえば、この方法で電子メールの添付ファイルが送信されます。
私は、Webサービスを介して大きなバイナリオブジェクト(画像)を転送するときに、実用的な意味で使用します。そのため、Pythonスクリプトを使用してC#Webサービスをテストしているとき、バイナリオブジェクトを少し魔法で再作成できます。
[Pythonで]
import base64
imageAsBytes = base64.b64decode( dataFromWS )
“ Base64エンコードスキームは、テキストデータを処理するように設計されたメディアで保存および転送する必要があるバイナリデータをエンコードする必要がある場合によく使用されます。これは、トランスポート中にデータを変更せずにそのまま維持するためです”(Wiki、2017)
例は次のとおりです。ASCII文字のみを受け入れるWebサービスがあるとします。保存してからユーザーのデータを他の場所(API)に転送しますが、受信者はそのままのデータを受け取りたいと考えています。 Base64はそのためのものです。 。 。唯一の欠点は、base64エンコードが通常の文字列よりも約33%多くのスペースを必要とすることです。
別の例:: uenc = url encoded = aHR0cDovL2xvYy5tYWdlbnRvLmNvbS9hc2ljcy1tZW4tcy1nZWwta2F5YW5vLXhpaS5odG1s = http://loc.querytip.com/checkout/cart/add/uenc/http://loc.magento.com/asics -men-s-gel-kayano-xii.html / product / 93 / ”
ほとんどの場合、ASCII文字セットまたは単純な文字セットのみを処理できるコンテキストでバイナリデータをエンコードするために使用されていました。
Bradが言っていることを少し拡張するには:電子メールとUsenetの多くのトランスポートメカニズムおよびその他のデータ移動方法は「8ビットクリーン」ではありません。 -たとえば、0x0Dはキャリッジリターンと見なされ、キャリッジリターンとラインフィードに変換されます。 Base 64は、すべてのバイナリ文字をいくつかの標準のASCII文字と数字、および句読点にマッピングするため、このように混乱することはありません。
メール機能が導入された数年前、それは完全にテキストベースであり、時間が経つにつれて、画像やメディア(オーディオ、ビデオなど)のような添付ファイルの必要性が生まれました。これらの添付ファイルがインターネット(基本的にバイナリデータの形式)で送信される場合、バイナリデータが破損する可能性は生の形式で高くなります。そのため、この問題に取り組むためにBASE64が登場しました。
バイナリデータの問題は、C、C ++などの一部の言語では文字列の終わりを表すヌル文字が含まれているため、NULLバイトを含む生の形式でバイナリデータを送信すると、ファイルが完全に読み取られず、破損する可能性があることですデータ。
例:
CおよびC ++では、この「null」は文字は文字列の終わりを示します。だから「こんにちは」次のように保存されます。
H E L L O
72 69 76 76 79 00
00は「ここで停止」と表示されます。
次に、BASE64エンコードの仕組みを詳しく見てみましょう。
注意点:文字列の長さは3の倍数である必要があります。
例1:
エンコードする文字列:“ ace&#8221 ;、長さ= 3
1)各文字を10進数に変換します。
a = 97、c = 99、e = 101
2)各10進数を8ビットのバイナリ表現に変更します。
97 = 01100001、99 = 01100011、101 = 01100101
組み合わせ:01100001 01100011 01100101
3)6ビットのグループに分けます。
011000 010110 001101 100101
4)2進数から10進数への計算
011000 = 24、010110 = 22、001101 = 13、100101 = 37
5)base64チャートを使用して、decimal文字をbase64に変換します。
24 = Y、22 = W、13 = N、37 = l
“ ace” => “ YWNl”
例2:
エンコードする文字列:“ abcd” Length = 4、3の倍数ではありません。したがって、文字列の長さを3の倍数にするには、2ビットのパディングを追加してlength = 6にする必要があります。パディングビットは“ =”署名します。
注意点:1つのパディングビットは2つのゼロ00と等しいため、2つのパディングビットは4つのゼロ0000と等しくなります。
プロセスを開始しましょう:–
1)各文字を10進数に変換します。
a = 97、b = 98、c = 99、d = 100
2)各10進数を8ビットのバイナリ表現に変更します。
97 = 01100001、98 = 01100010、99 = 01100011、100 = 01100100
3)6ビットのグループに分けます。
011000、010110、001001、100011、011001、00
最後の6ビットは完全ではないため、4つのゼロ“ 0000”に等しい2つのパディングビットを挿入します。
011000、010110、001001、100011、011001、000000 ==
今、それは等しいです。最後の2つの等号は、4つのゼロが追加されたことを示しています(デコードに役立ちます)。
4)2進数から10進数を計算します。
011000 = 24、010110 = 22、001001 = 9、100011 = 35、011001 = 25、000000 = 0 ==
5)base64チャートを使用して、decimal文字をbase64に変換します。
24 = Y、22 = W、9 = j、35 = j、25 = Z、0 = A ==
“ abcd” => “ YWJjZA ==”
Base64
Base64は、バイナリデータを数値的に処理し、Base 64表現に変換することにより、バイナリデータをエンコードする類似のエンコードスキームの総称です。 Base64の用語は、特定のMIMEコンテンツ転送エンコーディングに由来します。
Base64エンコードスキームは、テキストデータを処理するように設計されたメディアで保存および転送する必要があるバイナリデータをエンコードする必要がある場合によく使用されます。これは、転送中にデータが変更されずにそのまま残るようにするためです。 Base64は、MIME経由の電子メールやXMLでの複雑なデータの保存など、多くのアプリケーションで一般的に使用されています。
Base64は多くの目的に使用できます。
主な理由は、バイナリデータを適切なものに変換することです。
時々、サイト間でJSONデータを渡し、情報を保存するために使用します ユーザーに関するCookie内。
注: あなたは「できる」暗号化に使用する-なぜできないと言うのか、暗号化ではないのかわかりませんが、簡単に壊れてしまい、眉をひそめられます。暗号化とは、ある文字列のデータを別の文字列に変換することを意味します。これは、後で復号化できるかどうかにかかわらず、base64が行うことです。