Base64にエンコードしてPOSTした文字列がデコードできない。
文字列を、Base64でパスワードをかけてエンコードして、WebサーバーにPOSTして、データベースに保存しています。
保存されている文字列をデコードしようと思ったら、
「Base-64 文字配列の長さが無効です。」
というエラーが発生しました。
言語はVB.netを使っています。
C#.netのおすすめの本があります。
C#文法基本のキ: C#初心者が最初に身に着けるべき30の文法
この本の著者のピーコックアンダーソンという方の出している書籍は全部チェックするとよいです。
Kindle unlimitedだと0円で読むことができます。
.netはなんとなくコードがかけてしまうので、レベルアップしたい人にはおすすめです。
Base-64 文字配列の長さは何文字が正しい?
ちょっと気になったので、脱線しますが、Base64でエンコードした文字列の文字数に関して調べてみました。
エンコードする前は14文字、保存されている文字列は24文字です。
パスワードは6文字にしました。
文字配列の長さが無効ということなのですが、24文字が正しいのかどうかよくわかりません。
ウィキペディアで調べてみました。
-
元データを2進数に変換。
-
6ビットずつに分ける。
-
最後が6ビットにならなかったら、6ビットになるまで0を追加
-
変換表により変換
-
4の倍数にならなかったら、4の倍数になるまで=を追加
ちょっとWikipediaの記述とは違いますが、上のような仕組みです。
最終的な文字列は4の倍数ということなので、24文字というのは問題ないです。
14文字を2進数に変換すると1文字8ビットなので112ビットです。
112=6×18+4なので、「3.」の理屈からすると19文字
「5.」で20文字になります。
ただ、次のリンク先のページを参考にパスワードで暗号化してあるので、実際にエンコードされる直前の文字列は16文字になっていたようです。
16文字を2進数に変換すると1文字8ビットなので128ビットです。
128=6×21+2なので、「3.」の理屈からすると22文字
「5.」で24文字になります。
24文字は正しいことがわかりました。
文字数が正しいのに、「文字配列の長さが無効」?
文字数が正しいのに、「文字配列の長さが無効」が無効というエラーが発生します。
エラーの発生箇所は、「System.Convert.FromBase64String」に文字列を渡して、Byte配列に変換するときです。
FromBase64String メソッドに関して調べてみました。
MSDNでFromBase64String メソッドのページに、
sbase64 の数字、空白文字、および末尾の埋め込み文字で構成されます。 0 から昇順に、base64 の数字は、“Z”、文字の小文字を大文字の文字”A”から”z”、数字の「0」~「9」、“a”と、シンボル「+」と「/」です。
空白文字、Unicode 名、および 16 進コード ポイントがタブ (文字集計、u+0009) 改行 (ライン フィード、u+000 a)、復帰 (キャリッジ リターン, U+000D) と空白 (スペース、U +0 0020)。 空白文字の任意の数が表示できますsすべて空白文字は無視されるためです。
値として解釈されない文字が「=」、末尾の余白に使用します。 末尾s0、1 つまたは 2 つの埋め込み文字で構成できます。
という記述があります。
僕の読解能力のせいなのか、自動翻訳で生成されたものなのか、いまいち理解できませんが、「空白文字は無視される」とかいてあるので、スペースが無視されるのでしょう。
実際に、データベースに保存されている文字列にはスペースがありました。
でも、POSTした文字列にはスペースがありません。
よく見ると。半角の「+」が、半角スペースに変換されています。
半角の「+」はPOSTで送信した時に、半角スペースに変換されてしまうことがあるようです。
原因がわかったので、解決策です。
以下の2通りが簡単ですね。
-
デコードするときに、半角スペースを変換する
-
POSTするときに「+」をURLエンコードして「%2b」にしてPOSTする。