あちこちで「base 64 エンコーディング」について話しているのを聞いたことがあります。それは何のために使用されますか?
20 に答える
ネットワーク経由で送信したいバイナリ データがある場合、一般に、生の形式でビットとバイトをネットワーク経由でストリーミングすることはありません。なんで?一部のメディアはテキストのストリーミング用に作成されているためです。一部のプロトコルは、バイナリ データを制御文字として解釈する場合があります (モデムなど)。または、基になるプロトコルが特殊文字の組み合わせを入力したと見なす可能性があるため (FTP が行を変換する方法など)、バイナリ データが台無しになる可能性があります。エンディング)。
これを回避するために、人々はバイナリ データを文字にエンコードします。Base64 は、これらのタイプのエンコーディングの 1 つです。
なぜ64?
一般に、多くの文字セットに同じ 64 文字が存在することを信頼できるため、データがネットワークの反対側で破損することなく終了することを合理的に確信できるからです。
これは基本的に、任意のバイナリ データを ASCII テキストにエンコードする方法です。3 バイトのデータごとに 4 文字が必要であり、最後に少しパディングがかかる可能性があります。
基本的に、入力の各 6 ビットは 64 文字のアルファベットでエンコードされます。「標準」アルファベットは、A ~ Z、a ~ z、0 ~ 9、+、および / をパディング文字として使用します。URL セーフなバリアントがあります。
ウィキペディアは、より多くの情報を得るにはかなり良い情報源です。
Base-64 エンコーディングは、電子メールや HTML フォーム データなどで簡単に送信できるように、バイナリ データをテキストに変換する方法です。
何年も前にメール機能が導入されたとき、それは完全にテキストベースでしたが、時間が経つにつれて、画像やメディア (オーディオ、ビデオなど) などの添付ファイルの必要性が生じました。これらの添付ファイルがインターネット経由で (基本的にはバイナリ データの形式で) 送信されると、生の形式のバイナリ データが破損する可能性が高くなります。そこで、この問題に取り組むために BASE64 が登場しました。
バイナリ データの問題は、C や C++ などの一部の言語では文字列の末尾を表す null 文字が含まれているため、NULL バイトを含む生の形式でバイナリ データを送信すると、ファイルが完全に読み取られなくなり、データが破損することです。
例えば :
C および C++ では、この「ヌル」文字は文字列の終わりを示します。したがって、「HELLO」は次のように保存されます。
こんにちは
72 69 76 76 79 00
00 は「ここで止めて」と言います。
それでは、BASE64 エンコーディングのしくみについて詳しく見ていきましょう。
注意点:紐の長さは3の倍数にしてください。
例 1 :
エンコードする文字列:「ace」、Length=3
- 各文字を 10 進数に変換します。
a=97、c=99、e=101
- 各 10 進数を 8 ビットの 2 進数表現に変更します。
97= 01100001、99= 01100011、101= 01100101
結合 : 01100001 01100011 01100101
- 6ビットのグループに分けます。
011000 010110 001101 100101
- 2 進数から 10 進数への計算
011000= 24、010110= 22、001101= 13、100101= 37
- base64 チャートを使用して、小数点以下の文字を base64 に変換します。
24= Y、22= W、13= N、37= L
「エース」 => 「YWNl」</p>
例 2 :
エンコードする文字列 : “abcd” 長さ = 4、3 の倍数ではありません。したがって、文字列の長さを 3 の倍数にするには、長さ = 6 にするために 2 ビットのパディングを追加する必要があります。パディング ビットは「=」記号で表されます。
注意点 : 1 つのパディング ビットは 2 つのゼロ 00 に等しいため、2 つのパディング ビットは 4 つのゼロ 0000 に等しくなります。
それでは、プロセスを開始しましょう :–</p>
- 各文字を 10 進数に変換します。
a=97、b=98、c=99、d=100
- 各 10 進数を 8 ビットの 2 進数表現に変更します。
97= 01100001、98= 01100010、99= 01100011、100= 01100100
- 6ビットのグループに分けます。
011000、010110、001001、100011、011001、00
最後の 6 ビットが完全ではないため、4 つのゼロ「0000」に相当する 2 つのパディング ビットを挿入します。
011000、010110、001001、100011、011001、000000 ==
今、それは等しいです。最後の 2 つの等号は、4 つのゼロが追加されたことを示します (デコードに役立ちます)。
- 2 進数から 10 進数を計算します。
011000= 24、010110= 22、001001= 9、100011= 35、011001= 25、000000=0 ==
- base64 チャートを使用して、小数点以下の文字を base64 に変換します。
24= Y、22= W、9= j、35= j、25= Z、0= A ==
「abcd」 => 「YWJjZA==」</p>
これはバイナリ データのテキスト エンコーディングであり、結果のテキストには文字、数字、記号 "+"、"/"、"=" のみが含まれます。これは、特にテキスト データに使用されるメディアを介してバイナリ データを保存/送信する便利な方法です。
しかし、なぜ Base-64 なのですか? すぐに思いつくバイナリ データをテキストに変換するための 2 つの方法は次のとおりです。
- 10 進数: 各バイトの 10 進数値を 3 つの数値として保存します: 045 112 101 037 など。各バイトは 3 バイトで表されます。データは 3 倍に膨れ上がります。
- 16 進数: バイトを 16 進数のペアとして格納します: AC 47 0D 1A など。各バイトは 2 バイトで表されます。データは 2 倍に膨れ上がります。
Base-64 は、3 バイト (8 x 3 = 24 ビット) を、6 ビット (6 x 4 = 24 ビット) にわたる 4 文字にマップします。結果は「TWFuIGlzIGRpc3Rpb...」のようになります。したがって、膨らみは元の 4/3 = 1.3333333 倍にすぎません。
すでに述べたこととは別に、リストされていない2つの非常に一般的な使用法は次のとおりです。
ハッシュ:
ハッシュは、バイトのブロックを128ビットや256ビット(SHA / MD5)などの固定サイズの別のバイトブロックに変換する一方向性関数です。結果のバイトをBase64に変換すると、特に整合性のチェックサムを比較する場合に、ハッシュを表示するのがはるかに簡単になります。ハッシュはBase64で頻繁に見られるため、多くの人がBase64自体をハッシュと間違えます。
暗号化:
暗号化キーはテキストである必要はなく、生のバイトである必要があるため、Base64が便利なファイルまたはデータベースに保存する必要がある場合があります。結果の暗号化されたバイトと同じです。
Base64は暗号化でよく使用されますが、セキュリティメカニズムではないことに注意してください。Base64文字列は誰でも元のバイトに戻すことができるため、データを保護する手段として使用するのではなく、生のバイトをより簡単に表示または保存するための形式としてのみ使用してください。
証明書
PEM形式のx509証明書は、base64でエンコードされています。http://how2ssl.com/articles/working_with_pem_files/
コンピュータの初期の頃、電話回線のシステム間通信が特に信頼できるものではなかったとき、データの完全性を検証する手っ取り早い方法、つまり「ビット パリティ」が使用されていました。この方法では、送信されるすべてのバイトに 7 ビットのデータが含まれ、8 番目は 1 または 0 になり、バイト内の 1 ビットの総数が偶数になります。
したがって、0x01 は 0x81 として送信されます。0x02 は 0x82 になります。0x03 は 0x03 のままです。
このシステムをさらに進めるために、ASCII 文字セットが定義されたとき、00 ~ 7F の文字のみが割り当てられました。(現在でも、80 ~ FF の範囲に設定されている文字はすべて非標準です)
当時の多くのルーターは、パリティ チェックとバイト変換をハードウェアに組み込んでおり、それらに接続されたコンピューターは厳密に 7 ビット データを処理する必要がありました。これにより、電子メールの添付ファイル (および他のすべてのデータ。HTTP および SMTP プロトコルがテキストベースである理由) がテキストのみの形式に変換されます。
90 年代まで生き残ったルーターはほとんどありませんでした。それらのいずれかが今日使用されているとは思えません。
http://en.wikipedia.org/wiki/Base64から
Base64 という用語は、特定の MIME コンテンツ転送エンコーディングを指します。また、数値的に処理し、base 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 プロパティに埋め込むために使用できます。
一部のトランスポート プロトコルでは、英数字のみの送信が許可されています。制御文字を使用して特別なアクションをトリガーする状況や、文字ごとに限られたビット幅しかサポートしない状況を想像してみてください。Base64+
は、すべての入力を、英数字のみを使用するエンコーディングに変換/
し=
、埋め込み文字として使用します。
任意のバイナリ データを ASCII テキストに変換するために使用されます。
たとえば、電子メールの添付ファイルはこの方法で送信されます。
Webサービスを介して大きなバイナリオブジェクト(画像)を転送するときに、実用的な意味で使用します。したがって、Pythonスクリプトを使用してC#Webサービスをテストしている場合、バイナリオブジェクトは少し魔法をかけて再作成できます。
[Pythonで]
import base64
imageAsBytes = base64.b64decode( dataFromWS )
ほとんどの場合、ascii (または単純な) 文字セットしか処理できないコンテキストでバイナリ データをエンコードするために使用されるのを見てきました。
Brad が言っていることを少し拡張すると、電子メールや Usenet の多くのトランスポート メカニズムやその他のデータ移動方法は「8 ビット クリーン」ではありません。つまり、標準の ASCII 文字セット以外の文字は、転送中に壊れる可能性があります。たとえば、 0x0D はキャリッジ リターンと見なされ、キャリッジ リターンとライン フィードに変換される場合があります。Base 64 は、すべてのバイナリ文字をいくつかの標準の ASCII 文字、数字、および句読点にマップするため、この方法で混乱することはありません。