[5] [DFN[Base64]] は、[[オクテット列]]を64種類の[[英数字]]などに転写する[[符号化方式]]の一種です。 (一般に [Q[base 64]] は[Q[64進数]]を意味します。特に大文字で [Q[Base64]] と書いた場合や、インターネットで言われる場合には、 [[MIME]] の Base64 を指します。) * 符号化方式 [27] オクテット値3つ (8ビット×3 = 24ビット) を4文字 (6ビット×4) で表現します。ですからデータ量は3分の4倍、33%増加になります。 64文字 (と、特殊用途に使われる [CODE(char)[=]]) は、 [[ISO/IEC 646の版]]で全て共通に存在し、しかも [[EBCDIC]] の全ての版で使える文字から選ばれたそうです。 [PRE[ Value Encoding Value Encoding Value Encoding Value Encoding 0 A 17 R 34 i 51 z 1 B 18 S 35 j 52 0 2 C 19 T 36 k 53 1 3 D 20 U 37 l 54 2 4 E 21 V 38 m 55 3 5 F 22 W 39 n 56 4 6 G 23 X 40 o 57 5 7 H 24 Y 41 p 58 6 8 I 25 Z 42 q 59 7 9 J 26 a 43 r 60 8 10 K 27 b 44 s 61 9 11 L 28 c 45 t 62 + 12 M 29 d 46 u 63 / 13 N 30 e 47 v 14 O 31 f 48 w (pad) = 15 P 32 g 49 x 16 Q 33 h 50 y ]PRE] [28] Base64 は6ビット単位になりますが、オクテット列の長さと必ずしも 一致する (6と8の公倍数の長さになる) とは限らないので、 [CODE(char)[=]] で埋めて調節します。この結果、 Base64 data は必ず 4の整数倍の長さになります。 [24] Base64'ed data は、 一行辺り76文字以下でなければなりません。 ([[電子メイル]]/[[MIME]] の制限に由来。) 区切りの改行文字列 [CODE(char)[CRLF]] は、復号の時には無視されます。 (これ以外でも、上の表に無い文字が現れたら、無視して処理を続けます。) [43] あいうえお ([[長島]] [abc] [WEAK[2006-06-14 12:53:07 +00:00]]) [44] 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 ([[名無しさん]] [WEAK[2006-07-11 08:28:38 +00:00]]) [47] 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 ([[名無しさん]] [WEAK[2006-11-08 11:25:53 +00:00]]) [[#comment]] * 仕様 [25] Base64 は、最初 [[PEM]] ([[RFC 1421]] ) で規定されましたが、後に [[MIME]] ([[RFC 1341]] , [[RFC 1521]] , [[RFC 2045]] ) で採用され、広く普及するに至りました。 [15] その後、 Base64 を規定する新しい RFC, [[RFC 3548]] がでました。 [6] PEM 以来の Base64 の定義を採用する仕様: - [[PEM]] 署名 - [[MIME]] [CODE(MIME)[Base64]] [[転送符号化]] - [CODE(MIME)[[[x-gzip64]]]] 転送符号化 - [[PGP/MIME]] 署名 - MIME [CODE(MIME)[[[Content-MD5]]:]] 欄 - [[822]] [CODE(822)[[[Face]]:]] 欄 - MIME [CODE(ABNF)[[[encoded-word]]]] [CODE(MIME)[B]] 符号化 - [CODE(URI)[[[data]]:]] [[URI]] [[scheme]] - [[uuencode]] 風表現 >>3 - [32] [CODE(ABNF)[[[instance-digest]]]] ([CODE(ABNF)[[[digest-algorithm]]]] が [CODE(HTTP)[[[SHA]]]] または [CODE(HTTP)[[[MD5]]]] の時) [33] [[RFC 3548]] の MIME 型 Base64 の定義を採用する仕様: - [[RFC 3548]] の MIME 型 Base64 - [[XMPP]] ([[RFC 3920]]) [30] よく参照される MIME の Base64 の定義には76文字制限がありますが、 この制限を撤廃した仕様も多くあります。 MIME の Base64 の定義から行長制限を撤廃したもの: - [[XML Schema]] のデータ型 [CODE(XML)[[[base64Binary]]]] [36] [[Atom 1.0]] ([[RFC 4287]]) では、[[RFC 3548]]の定義を参照しています。 ただし、最初と最後に[[空白]]があっても'''構いません'''。 また、各[[行]]は[CODE(char)[[[U+000A]]]] 1つで区切ります。 [46] [[RFC 4648]] ([[名無しさん]] [WEAK[2006-10-17 23:10:24 +00:00]]) [[#comment]] * uuencode 風表現 [3] [[MIME]] 以外の場面でファイルを貼り付けるのに、 [[uuencode]] みたいな書き方をすることがあるみたい。 例1: [PRE(example)[ begin-base64 644 base64ed.data [INS[... base64 stream ...]] ==== ]PRE] [26] 例2: [PRE(example)[ begin-base64 644 code.tgz [INS[... base64 stream ...]] = ]PRE] [[#comment]] * 変種 [23] MIME Base64 と似ながら少しずつ異なる変種がいろいろ知られています。 [31] '''主要なチェック点''': :字母:MIME の字母65文字と出入りはないか? :詰め:詰め文字は必須か、省略可能か、禁止か? :改行:行長制限はあるか? あるなら何文字 (以内 / 丁度) か? :空白:空白・改行の混入を認めているか? :誤り処理:字母以外の文字の混入時の処理は? 字母数が4の倍数でない時の処理は? ** 詰め文字の省略 [1] データ長がある程度決まっている場合は、 [CODE(char)[=]] padding が無駄であることがあります。この場合で、 [CODE(char)[=]] padding を省略すると規定しているものがあります。 [2] 必ず[[8ビット・バイト]]を使用するものは、 [CODE(char)[=]] padding の代わりに、元のデータの後に任意個の [CODE[0x00]] が並んでいる としても解釈上影響がないことがあります。そういうものがあります。 - [[UTF-7]] の Base64 は、必ず16ビット単位のデータを扱うので、 最後の詰め文字を省略すると規定されています。 - [29][[Norton AntiSpam]] は [CODE(ABNF)[[[encoded-word]]]] の最後の [CODE(MIME)[=]] を省くそうです。 [SRC[mew-dist 25264]] もちろんこの実装は MIME 違反です。 [39] 機械的に電子メイルを生成する類のプログラムで、 末尾に4つも [CODE(MIME)@en[=]] を付けるとんでもない符号化するものがあるそうです。 [WEAK[(しかも改善するように要求したら使っている [[MUA]] が悪いのだろうと言われたとか。。。)]] ([[名無しさん]] [sage] [WEAK[2005-12-10 07:32:30 +00:00]]) [45] [[RFC 4387]] では個低調の[[オクテット列]]を符号化するため、常に最後が [CODE[=]] になってしまうので、 [CODE[=]] は省略することになっています。 [SRC@en[[[RFC 4387]] 2.1]] ([[名無しさん]] [sage]) [[#comment]] ** 斜線の代替文字 [22] MIME の Base64 字母には [CODE(char)[/]] が含まれますが、 色々なシステムで階層の区切り文字として使われているので、 あまり嬉しくないことがあります。 [7] [[IMAP]] の修正 [[UTF-7]] では、 >>2 の修正に加えて、 [CODE(char)[/]] の代わりに [CODE(char)[,]] が使われています。 仕様書: - [[RFC 3501]] [CITE[INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1]] -- [CSECTION[5.1.3]] - [CITE[RFC ERRATA]] -- 明確化のための修正が行われています。 [9] [CODE(URI)[[[urn:urn-5]]]] [[URN]] [[名前空間]]で使っている Base64 変種は、 [CODE(char)[/]] の代わりに [CODE(char)[-]] を使います。 (URN では [CODE(URI)[/]] が使えないため。) また、詰め文字は使いません。 (''Namespace ID: urn-5'' ) [16] [[RFC 3548]] 曰く、 MIME Base64 ではファイル名や [[URI]] で安全ではないので、 [CODE(char)[/]] の代わりに [CODE(char)[~]] を使う提案があったそうです。しかし [CODE(char)[~]] もやはりファイル・システムや URI で安全とは言えません。 [17] そこで RFC 3548 はファイル名や URI で安全な代替 Base64 字母として、 [CODE(char)[+]] と [CODE(char)[/]] に代えて [CODE(char)[-]] と [CODE(char)[_]] を使うものを規定しています。それでも [CODE(char)[=]] が padding に使われてるので、まだ完全に URI で安全とは言えません。 [CODE(char)[-]] が先頭に来る可能性があるので [[Un|x]] で安全でない虞もあります。 [18] [[M$XML]] は [CODE(char)[/]] の代わりに [CODE(char)[*]] を使っていたそうです。最近の版では両方認識するそうです。 [[#comment]] ** memo [14] 変種ではありませんが、 [[MIME]] の [CODE(MIME)[[[application/octet-stream]]]] では、[[オクテット]] (8[[ビット]]) 単位でないビット列も扱うことが出来ます。 そのような場合には全体長が8の倍数になるようにビット [CODE[0]] を詰め、 詰めた数を引数でメモっておきます。 [[#comment]] * 実装 [4] [[Perl]] なら、 [CODE(perl)[[[MIME::Base64]]]] を使うのが気楽かと。 Perl 5.7.3 以降では標準で入っています。 但し、 >>1,>>2,>>7 のような変種には対応していません。 [8] [[uuencode]] も64進数であることを利用して、 uuencode で符号化した後に [CODE[[[tr]]]] を使うという方法が使われることもあります。 [[#comment]] * 安全性に関して [34] '''秘密情報送信のための使用''': [[HTTP]] の[[認証]]や [[SASL]] などでは、[[合言葉]]などの繊細な情報を送信するために Base64 を使うことがあります。 Base64 は[[転送符号化]]であって[[暗号化]]では''ありません''が、 第3者 [WEAK[(例えばシステムの管理者)]] が繊細な情報を含むメッセージを見てしまったとしても読むことができません [WEAK[(流石に脳内で Base64 を復号できる猛者はいないでしょう)]]。 もちろん、悪意のある人は計算機を使って復号してしまうでしょうから、 それに対する効果はありません。 [35] '''バッファ溢れ攻撃''': 不正な (字母に含まれない) 文字や末尾以外にある詰めの [CODE(char)[=]] への対処がいい加減だと、バッファ溢れ攻撃に使われることがあり得ます。 [SRC[[[RFC 3920]] 14.9 など]] [[#comment]] * メモ [12] [[インターネット]]でのオクテット列の文字列転写法の[[デ・ファクト標準]]です。 [10] [[XML]] でバイナリを扱う時には Base64 を使うのが推奨されている (誰に?) そうです。 ([Q[XML は人間可読である]]のじゃなかったのか? って気もするが。) [11] >>10 実際のところ、 [[ISO/IEC 6479]] の[[制御シーケンス]]とかが混じったデータを使いたいという要求はある。 (それは XML の思想に反するという反発は強く、 XML 1.1 でも結局駄目になったけど。) [21] >>11 [[XML 1.1]] では結局[[文字参照]]なら OK ([CODE(char)[[[U+0000]]]] 以外。) になりましたね。 [13] >>11 でも、せめて [CODE(char)[[ABBR[[[FF]]] [FORM FEED]]]] くらい使いたい気はする。 (実質 [[Un*x]] でしか使えない環境依存だから入れたくないのかもしれんが。) [37] [[XML]] [[デジタル署名]]系仕様では [[Base64]] を使うことを識別するために [CODE(URI)[[[http://www.w3.org/2000/09/xmldsig#base64]]]] という [[URI参照]]を使っています。 ([[名無しさん]] [sage]) [41] [CITE[たっぴ (パソコン質問掲示板) - Question and Answers -]] > BASE64への変換(エンコード)やBASE64からの逆変換(デコード)はこちらで確認することができるようです。 http://suika.fam.cx/~wakaba/-temp/wiki/wiki?Base64 ちょ[AA(fw)[wwwwwwwwwwwwwwwwwwwwwwwwwww]] そんな話聞いたことないって[AA(fw)[www]] ([[名無しさん]] [WEAK[2006-05-28 11:09:01 +00:00]]) [42] [CITE[Base64 - Wikipedia, the free encyclopedia]] ([[名無しさん]] [WEAK[2006-06-11 00:06:34 +00:00]])