思い込みのよる事で、無駄な時間を過ごすことを思い知った、ユゲタです。
とあるシステム構築をしているときに、base64を使って、単純な平文を、ほんの少し難読化してしまおうと考えて、
macのターミナルでbase64コマンドを打ち込んで、文字列をbase64化して、それをシステムに組み込んで使ったところ、
見事に、エラー勃発!!!
作業を見直して、base64の変換方法を見直しても、手順も、どこも間違いはないはず・・・
という感じで、3時間ほどかかってようやく原因を突き止めて、無事に解決したという話です。
base64変換
そもそも、変換する文字列は、複数のキーワードをbase64化した1つのURLクエリで送ってしまって、受け取ったがわで、
base64デコードをして利用するという内容でした。
仮に、「aaa」「bbb」「ccc」という文字列を -> 「aaa,bbb,ccc」というcsv方式の文字列にくっつけた状態にして、base64変換をします。
echo "aaa,bbb,ccc" | base64
> YWFhLGJiYixjY2MK
すると、「YWFhLGJiYixjY2MK」という文字列が返ってくるので、それをシステムに送ると、自動的にbase64デコードされて、","カンマでsplitされるという流れですが、
どうやら、その中の文字列がおかしくなっているとのことで、エラーが返ってきてしまいます。
原因はechoコマンド
当初、base64コマンドに何らかのオプションを付けていないのが原因かと調べたり、実際にコマンドで、デコードしてみても、何の問題も見つけられませんでした。
ちなみに、macのターミナルコマンドだけじゃなくて別のシステムでbase64変換したらどうなるのかやってみました。
例えば次のサイトでは、phpでbase64変換を実行してくれます。
https://www.en-pc.jp/tech/base64.php
その結果は、
「YWFhLGJiYixjY2M=」
先程のmacでコンバートしたものは、
「YWFhLGJiYixjY2MK」
あれ???、なんか、最後の文字列が違ってる・・・
そういえばと思って、確か過去に、echoのオプションについて、誰かから助言されたことを思い出しました。
ターミナルで使うときに、-nをつけないと、文字列に改行コードがくっついてしまうのだそうです。
なので、最初に変換した文字列は、"aaa,bbb,ccc"が"aaa,bbb,ccc\n"という文字列で変換されていて、cccに改行コードが無駄にくっついてしまっていました。
なので、ターミナルコマンドで次のように実行
echo -n "aaa,bbb,ccc" | base64
> YWFhLGJiYixjY2M=
おおお!!!見事にphpで変換した文字列と同じになった!
改行コードは、わかりずらいんじゃ
何故、最初の方に確認したエンコードされたbase64文字列をデコードしたときに、改行コードが入っていることに気が付かなかったのかと言うと、
$ echo "YWFhLGJiYixjY2MK" | base64 -d
> aaa,bbb,ccc
$ echo "YWFhLGJiYixjY2M=" | base64 -d
> aaa,bbb,ccc%
こんな感じで、最初の方が、改行コードが含まれているもので、あとの方が、正常の方ですが、
正常の方にゴミがくっついてしまっているのがわかりますが、ターミナルを使うと、こうした不手際が起こりがちなんですね。
ちゃんと-nオプションを理解しておかないと、とんでもないトラブルに繋がりそうです。
ちなみに、デコードのときのechoには、-nオプションはいらないようですね。
※つけてもつけなくても結果は変わりませんでした。
0 件のコメント:
コメントを投稿