最も安全な方法は、SSL チャネルを使用して認証を要求することです。認証が成功した場合は、何らかのセッション キー (ランダムに生成された文字列) をクライアントに返し、すべての要求でそれを確認できます。
サービスで SSL の使用が許可されていない場合は、パートナーに単純なユーザー名/パスワード認証を追加するだけで試すことができますが、この場合、誰かがあなたの通信を傍受した場合、同じ資格情報でサービスにアクセスできます。
他の方法は、すべてのリクエストで署名を使用することです。たとえば、この目的で GPG を使用できます。サーバーは、すべてのパートナーの公開鍵を保持しています。パートナーがサーバーにクエリを送信する場合、彼は自分の秘密鍵でリクエストに署名するだけで、受信時に、このリクエストが特定のパートナーによって送信され、100% 偽造されていないことを安全に確認できます。
編集
GPG の場合、 gnupgという PECL モジュールをインストールする必要があります。これは、GPG 機能を利用するフレームワークのクラスです。
class GPG
{
/**
* Encrypt given data to one or more recipients
*
* @param string $string
* @param string|array $encryptKeyID
* @param bollean $armour
* @return string
*/
public static function encrypt($string, $encryptKeyID, $armour = true){
$gpg = new Crypt_GPG();
if(is_array($encryptKeyID)){
foreach($encryptKeyID as $keyId){
$gpg->addEncryptKey($keyId);
}
}
else{
$gpg->addEncryptKey($encryptKeyID);
}
return $gpg->encrypt($string, $armour);
}
/**
* Decrypt given data
*
* @param string $string
* @param string $keyPassword
* @param string $keyID
* @return string
*/
public static function decrypt($string, $keyID, $keyPassword = null){
$gpg = new Crypt_GPG();
$gpg->addDecryptKey($keyID, $keyPassword);
return $gpg->decrypt($string);
}
/**
* Sign given string
*
* @param string $string
* @param string $keyID
* @param string $keyPassword
* @param boolean $mode
* @param boolean $armor
* @return string
*/
public static function sign($string, $keyID, $keyPassword = null, $mode = null, $armor = true){
$gpg = new Crypt_GPG();
if($mode === null){
$mode = Crypt_GPG::SIGN_MODE_CLEAR;
}
$gpg->addSignKey($keyID, $keyPassword);
return $gpg->sign($string, $mode);
}
/**
* Verify signature of given message
*
* @param string $string
* @return boolean
*/
public static function verify($string){
$gpg = new Crypt_GPG();
$signatures = $gpg->verify($string);
if ($signatures[0]->isValid()) {
return true;
}
else{
return false;
}
}
/**
* Encrypt and sign given string to one or more recipients
*
* @param string $string
* @param string|array $encryptKeyID
* @param string $signkeyID
* @param string $signkeyPassword
* @param boolean $mode
* @param boolean $armor
* @return string
*/
public static function encryptAndSign($string, $encryptKeyID, $signkeyID, $signkeyPassword = null, $mode = null, $armor = true){
$gpg = new Crypt_GPG();
if($mode === null){
$mode = Crypt_GPG::SIGN_MODE_CLEAR;
}
$gpg->addSignKey($signkeyID, $signkeyPassword);
if(is_array($encryptKeyID)){
foreach($encryptKeyID as $keyId){
$gpg->addEncryptKey($keyId);
}
}
else{
$gpg->addEncryptKey($encryptKeyID);
}
return $gpg->encryptAndSign($string, $armor);
}
/**
* Decrypt and verify given string
*
* @param string $string
* @param string $keyID
* @param string $keyPassword
* @return array|false
*/
public static function decryptAndVerify($string, $keyID, $keyPassword = null){
$gpg = new Crypt_GPG();
$gpg->addDecryptKey($keyID, $keyPassword);
$result = $gpg->decryptAndVerify($string);
if(empty($result['data']) and empty($result['signatures'])){
return false;
}
if(isset($result['signatures'][0])){
$result['signature'] = $result['signatures'][0]->isValid();
unset($result['signatures']);
}
return $result;
}
}