PHP Git 連携方法〜暗号化と復号化、GitとTwitterの連携〜

イントロダクション

レンタルサーバーでWebAPI(TwitterAPIなど)を使用する時にユーザー名とパスワードが必要な時があります。しかしユーザー名とパスワードは機密情報なので公開したくありません。ではどーしたら良いでしょうか?

暗号化と復号化

よく世間で耳にするのはSSL通信とか暗号化通信とか、セキュリティ。。。なんて言葉がよく聞かれます。

では、どのようにして機密情報を保護したら良いでしょうか?無難な方法としては暗号化です。これを使用するためには復号も必要ですがこれらをワンセットにしておけば問題ありません。

PHPでの暗号化と復号化

Mcrypt関数を使用するのが簡単だと(たまたま見つけたソース)思うのでこれを使用します。

自分の使用する端末では各関数への参照を探すのが面倒なのでレンタルサーバーの環境でテストします。つまりファイルをアップロードしてテストします。他の人が皆居場所なら問題ないでしょう(笑)

PHPコードを作成します。

参考サイトのコードをコピって起動してみます。出力されたデータは以下のようなものでした。
「string(18) "證怜捷蛹悶ョ繝シ繧ソ" string(24) "\c2ElE袿q刔]5�ーイnェツ表" string(24) "證怜捷蛹悶ョ繝シ繧ソ" ok」まぁ文字化けしています。
とりあえずはエンコード処理を追加します。

/** エンコード */
header("Content-Type: text/html; charset=UTF-8");

改めて実行します。出力結果は下に。。。

「string(18) "暗号化データ" string(24) "\��c2ElE��q��]5���n�•\" string(24) "暗号化データ" ok」

エンコードの問題でした。。。

ここから使用したいように変更を加えます。PHPコードは下のようになっています。

/** エンコード(追加した部分) */
header("Content-Type: text/html; charset=UTF-8");
/** 追加終わり */
$key = "暗号化キー";
$plain_text = "暗号化データ";
/* モジュールをオープンし、IV を作成 */
$td = mcrypt_module_open('des', '', 'ecb', '');
$key = substr($key, 0, mcrypt_enc_get_key_size($td));
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

/* 暗号化ハンドルを初期化 */
if (mcrypt_generic_init($td, $key, $iv) != -1) {

	/* データを暗号化 */
	$c_t = mcrypt_generic($td, $plain_text);
	mcrypt_generic_deinit($td);

	/* 復号のため、バッファを再度初期化 */
	mcrypt_generic_init($td, $key, $iv);
	$p_t = mdecrypt_generic($td, $c_t);

	/* 後始末 */
	mcrypt_generic_deinit($td);
	mcrypt_module_close($td);
}

/* 結果 */
var_dump($plain_text, $c_t, $p_t);

/* 元の文字と比較する場合 */
if (strncmp($p_t, $plain_text, strlen($plain_text)) == 0) {
	echo 'ok';
} else {
	echo 'error';
}

設計をする

今回はTwitterAPIを使用してgithubから飛んでくるリクエスト(hook)を受けてツイートするというシンプルな実装です。下準備として以下のことを行います。

GithubのWebhook設定を行う。

手順はリンク先にあります。そしてこの設定を行う時に「Secret」という項目があるのでそこに値を入れます。そしてこれを変換するときのキーとするもよし、アクセスしてきたURLが想定通りの(Github)からのリクエストか判断するためのものでもよし。設定しておくと便利です。

<サンプル設計>

これは、自分が簡単に設計したものになります。

  1. GithubよりWebhookを受けたかどうか判定。
  2. Githubよりのリクエストでない場合は、処理をしない。
  3. Githubよりのリクエストだった場合は4〜の処理を行う。
  4. ユーザー情報ファイルを読み込む(暗号化済み)
  5. TwitterAPIのライブラリを読み込む。
  6. 上記のファイルより取得したユーザー名とパスワードでTwitterにログインしてツイート
  7. あと処理が必要ならやる(実装後に判断)

あとは実装あるのみです。。。

でわでわ。。。