Jakarta Commons Codec による Base64符号の末尾に改行が付加される件について

Amazon の Web API (Product Advertising API) が、最近 クエリーに署名を要求するようになったので、Javaで書かれた手元のアプリを修正した。

サンプルが与えられているのでまずはこれをコピペした。
http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?AuthJavaSampleSig2.html

エラー

しかしうまく動かなかった。エラーが返ってくる:

<?xml version="1.0"?>
<ItemLookupErrorResponse xmlns="http://ecs.amazonaws.com/doc/2009-01-06/">
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.</Message>
</Error>
<RequestID>********-****-****-****-************</RequestID>
</ItemLookupErrorResponse>

原因

コード中、次の部分は、jakarta の commons codec のクラスを使って BASE64エンコードをしているが、

      Base64 encoder = new Base64();
      signature = new String(encoder.encode(rawHmac));

ここで、signature (署名を格納する変数) の末尾に改行が追加されてしまい、署名がおかしくなる。

修正

      Base64 encoder = new Base64();
      signature = new String(encoder.encode(rawHmac)).trim();

と修正した。

そういう仕様? Jakarta Commons Codec の実装が悪い?

org.apache.commons.codec.binary.Base64BASE64エンコードの末尾に改行を付加するのは、Base64が元々そういう仕様なのだろうか?

追記: http://vividcode.hatenablog.com/entry/2012/05/12/051058 も参照