私は人々があちこちで「ベース64エンコーディング」について話すのを聞いた。それは何のために使われますか?
ネットワークを介して出荷したいバイナリデータがある場合は、通常、生のフォーマットでワイヤを介してビットとバイトをストリーミングするだけではできません。どうして?一部のメディアはストリーミングテキスト用に作られているからです。あなたは決して知らない - あるモデムはあなたのバイナリデータを制御文字として解釈するかもしれない(モデムのように)、あるいは基礎となるプロトコルがあなたが特別な文字の組み合わせを入力したと思うかもしれないのであなたのバイナリデータはめちゃくちゃになる末尾)。
これを回避するために、人々はバイナリデータを文字にエンコードします。 Base64は、これらの種類のエンコーディングの1つです。
なぜ64?
多くの文字セットに存在する同じ64文字に通常頼ることができるので、データが破損していない状態でワイヤの反対側に行き着くことになると合理的に自信を持って考えることができます。
これは基本的にはASCII textで任意のバイナリデータをエンコードする方法です。 3バイトのデータあたり4文字と、最後に1ビットのパディングが必要です。
基本的に、入力の各6ビットは64文字のアルファベットでエンコードされています。 「標準」のアルファベットは、A〜Z、a〜z、0〜9、および+と/を使用し、=を埋め込み文字として使用します。 URLセーフな亜種があります。
ウィキペディア は、より多くの情報の妥当な情報源です。
Base-64エンコーディングは、バイナリデータをテキストに変換して電子メールやHTMLフォームデータなどで簡単に送信できるようにする方法です。
これはバイナリデータのテキストエンコードで、結果のテキストには文字、数字、記号 "+"、 "/"、 "="以外の何もありません。テキストデータ専用のメディアを介してバイナリデータを保存/送信するのに便利な方法です。
しかし、なぜBase-64なのでしょうか。すぐに思い浮かぶ、バイナリデータをテキストに変換するための2つの選択肢は、次のとおりです。
Base-64は、6ビット(6 x 4 = 24ビット)にまたがる4文字で3バイト(8 x 3 = 24ビット)をマップします。結果は "TWFuIGlzIGRpc3Rpb ..."のようになります。したがって、膨満感は元の4/3 = 1.3333333倍に過ぎません。
すでに述べたこと以外に、記載されていない2つの非常に一般的な用途は
ハッシュ:
ハッシュは、1バイトのブロックを、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コンテンツ転送エンコーディングを指します。また、バイナリデータを数値的に扱い、それをbase 64表現に変換することによってバイナリデータをエンコードする、任意の同様のエンコード方式の総称としても使用されます。 baseの特定の選択は、文字セットエンコーディングの歴史によるものです。ほとんどのエンコーディングに共通のサブセットの一部であり、印刷も可能な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年代まで生き残ったルーターはほとんどありません。私はそれらのどれかが今日使われているのを厳しく疑っています。
いくつかの輸送プロトコルは英数字だけが送信されるのを許可します。制御文字が特別な動作を引き起こすために使用されている状況や、1文字あたりの限られたビット幅しかサポートしていない状況を想像してみてください。 Base64 は、入力を英数字、+
、/
、および=
のみを埋め込み文字として使用するエンコードに変換します。
ここで説明するBase64の使用法は多少ハックです。それであなたがハックが好きでないならば、続けないでください。
MySQLのutf8は3バイトバージョンのutf8を使用しているため、4バイトのUnicode文字をサポートしていないことが判明したとき、私は問題に直面しました。それで私はMySQLのutf8上でフル4バイトのUnicodeをサポートするために何をしましたか?データベースに格納するときはbase64で文字列をエンコードし、取得するときはbase64でデコードします。
Base64のエンコードとデコードは非常に高速なので、上記は完璧に機能しました。
以下の点に注意してください。
Base64エンコーディングは33%以上のストレージを使用します
データベースに格納されている文字列は人間が読めるものではありません(データベース文字列が基本的な形式の暗号化を使用する機能として販売することもできます)。
あなたはUnicodeをサポートしていない任意のストレージエンジンのために上記の方法を使用することができます。
任意のバイナリデータをASCIIテキストに変換するために使用されます。
たとえば、電子メールの添付ファイルはこの方法で送信されます。
Webサービスを介して大きなバイナリオブジェクト(画像)を転送するとき、私はそれを実用的な意味で使用します。そのため、Pythonスクリプトを使用してC#Webサービスをテストしているときに、少し手を加えてバイナリオブジェクトを再作成できます。
[Pythonで]
import base64
imageAsBytes = base64.b64decode( dataFromWS )
ほとんどの場合、私はこれがASCIIまたは単純な文字セットしか扱えないコンテキストでバイナリデータをエンコードするのを見ました。
EメールやUsenetなどのデータ移動方法の多くの転送メカニズムは「8ビットクリーン」ではないため、標準のASCII文字セット以外の文字が転送中に破損する可能性があります。 0x0Dはキャリッジリターンと見なされ、キャリッジリターンとラインフィードに変わります。 Base 64では、すべてのバイナリ文字をいくつかの標準のASCII文字と数字、句読点に変換して、それらがこのように壊れないようにしています。
Base64
Base64は、バイナリデータを数値的に扱い、それをbase 64表現に変換することによってバイナリデータをエンコードする、いくつかの同様のエンコード方式の総称です。 Base64という用語は、特定のMIMEコンテンツ転送エンコーディングに由来します。
Base64エンコード方式は、テキストデータを処理するように設計されたメディアを介して格納および転送する必要があるバイナリデータをエンコードする必要がある場合に一般的に使用されます。これは、転送中にデータが変更されずにそのまま残ることを保証するためです。 Base64は、MIMEを介した電子メール、XMLでの複雑なデータの保存など、さまざまなアプリケーションで一般的に使用されています。
Base64はさまざまな目的に使用できます。
主な理由は、バイナリデータを渡すことができるものに変換することです。
私は時々それをJSONデータをあるサイトから別のサイトへ転送するために、ユーザーに関するクッキーに情報を保存するために使用します。
注:あなたは暗号化のためにそれを「使用する」ことができます - なぜ人々があなたができないと言うのか、そしてそれが暗号化ではないことを私は知りません。暗号化とは、ある文字列のデータを別の文字列のデータに変換して後で復号できるようにすることを意味します。これがbase64の機能です。
何年も前に、メール機能が導入されたとき、それは時間が経つにつれて完全にテキストベースだったので、画像やメディア(オーディオ、ビデオなど)のような添付ファイルの必要性が生じました。これらの添付ファイルがインターネット(基本的にはバイナリデータの形式です)を介して送信される場合、バイナリデータが破損する可能性は、その生の形式のほうが高くなります。そこで、この問題に取り組むためにBASE64が登場しました。
バイナリデータの問題は、C、C++などの一部の言語では文字列の終わりを表すNULL文字が含まれているため、NULLバイトを含む生の形式でバイナリデータを送信するとファイルが完全に読み取られず、データが破損することです。
例えば :
CおよびC++では、この "null"文字は文字列の終わりを示します。したがって、 "HELLO"は次のように格納されています。
こんにちは
72 69 76 76 79 00
00は「ここで止まる」と言っています。
それでは、BASE64エンコーディングのしくみについて説明しましょう。
注意すべき点:文字列の長さは3の倍数でなければなりません。
例1:
エンコードされる文字列:“ ace”、長さ= 3
1)各文字を10進数に変換します。
a = 97、c = 99、e = 101
2)各10進数を8ビットの2進表現に変更します。
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チャートを使用して、小数点文字をbase64に変換します。
24 = Y、22 = W、13 = N、37 = 1
“ ace” =>“ YWN1”
例2:
エンコードされる文字列:“ abcd”の長さ= 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ビットの2進表現に変更します。
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チャートを使用して、小数点文字をbase64に変換します。
24 = Y、22 = W、9 = j、35 = j、25 = Z、0 = A ==
“ abcd” =>“ YWJjZA ==”