Digest::SHAがインストールされていないレンタルサーバでSHA256を使用する奇妙な方法

 Amazon Web Service のAPI呼び出しの仕様変更は8/15までに行わないといけないことを知り、今頃になって仕方なく自作のアプリケーションに対して修正を始めました。
 それでAPIを呼び出すためには「SHA256アルゴリズムでクエリ文字列のハッシュをHMAC方式で計算し、base64に変換する」する必要があり、SHA256変換を行うためには perlでは Digest::SHA モジュールを使う必要があるとのことですが、自分が使っているレンタルサーバではインストールされていませんでした。なのでこの手は使えません。

 PHPであれば、標準でHMAC方式で計算を行える hash_hmac 関数が(5.1.2以降では)用意されていて、

	$data = hash_hmac("sha256", $query, $secretkey, true);
	$signature = base64_encode($data);

 と2行だけで処理できてしまいます。さすがPHPは何でもアリだよなあと感心していたのですが、ここで何故か「SHA256でハッシュを計算するところだけPHPで処理させればいいんじゃね?」という電波を受信してしまったのが運の尽き(何故か)。
 引数にクエリ文字列と秘密鍵を受け取り、上記の処理を行うだけのPHPプログラムをサーバ上に用意し、perlではそのプログラムをLWP::UserAgentで呼び出して結果を取得するという方法でやってみることにしました。

PHP – hmac.php

< ?php
	$query = $_POST['q'];
	$secretkey = $_POST['s'];
	$data = hash_hmac("sha256", $query, $secretkey, true);
	echo base64_encode($data);
?>

perl

use LWP::UserAgent;
use HTTP::Request::Common qw(POST);

sub hmac_sha256_base64
{
	my ($q, $secretkey) = @_;
	my %formdata = ('q' => $q, 's' => $secretkey);
	my $request  = POST('http://hmac.phpを置いたサーバ/hmac.php', [%formdata]);
    my $ua = LWP::UserAgent->new();
	my $res = $ua->request($request);
	return $res->content;
}

# $qに変換したいクエリ文字列、$secretkeyにあなたの秘密鍵を設定
my $signature = hmac_sha256_base64($q, $secretkey);

 なお、Digest::SHAがインストールされていないサーバでは、こちらで紹介されているように全てperlで書かれたDigest::SHA::PurePerlをサーバにアップロードして use lib でパスを通して使うのが正解の模様です(手遅れ)。

1 thought on “Digest::SHAがインストールされていないレンタルサーバでSHA256を使用する奇妙な方法

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です