全部產品
Search
文件中心

Key Management Service:簽名驗簽樣本

更新時間:Dec 26, 2024

初始化KMS執行個體SDK用戶端後,您可以通過用戶端調用Sign和Verify介面進行簽名驗簽。本文介紹簽名驗簽的程式碼範例。

完整程式碼範例

調用Sign介面使用非對稱金鑰進行數位簽章,調用Verify介面使用非對稱金鑰驗證數位簽章。

源碼github地址:SignVerify.php

簽名驗簽完整程式碼範例

<?php

if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}

use AlibabaCloud\Dkms\Gcs\OpenApi\Util\Models\RuntimeOptions;
use AlibabaCloud\Dkms\Gcs\Sdk\Client as AlibabaCloudDkmsGcsSdkClient;
use AlibabaCloud\Dkms\Gcs\OpenApi\Models\Config as AlibabaCloudDkmsGcsOpenApiConfig;
use AlibabaCloud\Dkms\Gcs\Sdk\Models\SignRequest;
use AlibabaCloud\Dkms\Gcs\Sdk\Models\VerifyRequest;
use AlibabaCloud\Tea\Utils\Utils as AlibabaCloudTeaUtils;

// 填寫您在KMS應用管理擷取的ClientKey檔案路徑
// $clientKeyFile = '<your client key file path>';

// 或者,填寫您在KMS應用管理擷取的ClientKey檔案內容
$clientKeyContent = '<your client key content>';

// 填寫您在KMS應用管理建立ClientKey時輸入的加密口令
$password = getenv('CLIENT_KEY_PASSWORD');

// 填寫您的KMS執行個體VPC地址
$endpoint = '<your dkms instance service address>';

// 填寫您在KMS建立的非對稱主要金鑰Id
$keyId = '<your asymmetric cmk id>';

// 簽名演算法
$algorithm = '<your sign algorithm>';

// 待簽名訊息
$message = 'message data';

// 待簽名訊息資料類型,RAW-未經處理資料 DIGEST-摘要
$messageType = "RAW";

// KMS執行個體SDK Client對象
$client = getDkmsGcsSdkClient();
if (is_null($client)) exit(1);

//使用Data Encryption Service執行個體進行簽名驗簽樣本
signVerifySample();

/**
 * 使用Data Encryption Service執行個體進行簽名驗簽樣本
 * @return void
 */
function signVerifySample(){
    global $client, $keyId, $message, $messageType, $algorithm;

    $signatureCtx = signSample($client, $keyId, $message, $messageType, $algorithm);
    if ($signatureCtx !== null) {
        $verifyResult = verifySample($client, $message, $signatureCtx);
        if (!$verifyResult) {
            echo 'verify failed' . PHP_EOL;
        } else {
            echo 'signVerifySample success' . PHP_EOL;
        }
    }
}

/**
 * 簽名樣本
 * @param AlibabaCloudDkmsGcsSdkClient $client
 * @param string $keyId
 * @param string $message
 * @param string $messageType
 * @param string $algorithm
 * @return SignatureContext
 */
function signSample($client, $keyId, $message, $messageType, $algorithm) {
    // 構建簽章要求
    $signRequest = new SignRequest();
    $signRequest->keyId = $keyId;
    $signRequest->algorithm = $algorithm;
    $signRequest->message = AlibabaCloudTeaUtils::toBytes($message);
    $signRequest->messageType = $messageType;
    $runtimeOptions = new RuntimeOptions();
    // 忽略認證
    //$runtimeOptions->ignoreSSL = true;

    try {
        // 呼叫簽章介面進行簽名
        $signResponse = $client->signWithOptions($signRequest, $runtimeOptions);
        // 密鑰ID
        $keyId = $signResponse->keyId;
        // 簽名值
        $signature = $signResponse->signature;
        // 訊息類型
        $messageType = $signResponse->messageType;
        // 簽名演算法
        $algorithm = $signResponse->algorithm;
        var_dump($signResponse->toMap());
        return new SignatureContext([
            'keyId' => $keyId,
            'signature' => $signature,
            'messageType' => $messageType,
            'algorithm' => $algorithm
        ]);
    } catch (Exception $error) {
        if ($error instanceof \AlibabaCloud\Tea\Exception\TeaError) {
            var_dump($error->getErrorInfo());
        }
        var_dump($error->getMessage());
        var_dump($error->getTraceAsString());
    }
    return null;
}

/**
 * 驗簽樣本
 * @param AlibabaCloudDkmsGcsSdkClient $client
 * @param string $message
 * @param SignatureContext $ctx
 * @return bool|null
 */
function verifySample($client, $message, $ctx) {
    // 構建驗簽請求
    $verifyRequest = new VerifyRequest();
    $verifyRequest->keyId = $ctx->keyId;
    $verifyRequest->signature = $ctx->signature;
    $verifyRequest->message = AlibabaCloudTeaUtils::toBytes($message);
    $verifyRequest->messageType = $ctx->messageType;
    $verifyRequest->algorithm = $ctx->algorithm;
    $runtimeOptions = new RuntimeOptions();
    // 忽略服務端認證
    //$runtimeOptions->ignoreSSL = true;

    try {
        // 調用驗簽介面進行驗簽
        $verifyResponse = $client->verifyWithOptions($verifyRequest, $runtimeOptions);
        // 驗簽結果
        $value = $verifyResponse->value;
        var_dump($verifyResponse->toMap());
        return $value;
    } catch (Exception $error) {
        if ($error instanceof \AlibabaCloud\Tea\Exception\TeaError) {
            var_dump($error->getErrorInfo());
        }
        var_dump($error->getMessage());
        var_dump($error->getTraceAsString());
    }
    return null;
}

/**
 * 構建KMS執行個體SDK Client對象
 * @return AlibabaCloudDkmsGcsSdkClient
 */
function getDkmsGcsSdkClient()
{
    global $clientKeyContent, $password, $endpoint;

    // 構建KMS執行個體SDK Client配置
    $config = new AlibabaCloudDkmsGcsOpenApiConfig();
    //連線協定請設定為"https"。KMS執行個體服務僅允許通過HTTPS協議訪問。
    $config->protocol = 'https';
    //Client Key。
    $config->clientKeyContent = $clientKeyContent;
    //Client Key口令。
    $config->password = $password;
    //設定endpoint為<your KMS Instance Id>.cryptoservice.kms.aliyuncs.com。
    $config->endpoint = $endpoint;
    // 執行個體CA認證
    $config->caFilePath = 'path/to/caCert.pem';

    // 構建KMS執行個體SDK Client對象
    return new AlibabaCloudDkmsGcsSdkClient($config);
}

/**
 * The signature context may be stored
 */
class SignatureContext
{
    public function __construct($config = [])
    {
        if (!empty($config)) {
            foreach ($config as $k => $v) {
                $this->{$k} = $v;
            }
        }
    }
    /**
     * @var string
     */
    public $keyId;

    /**
     * @var int[]
     */
    public $signature;

    /**
     * @var string
     */
    public $messageType;

    /**
     * @var string
     * Use default algorithm value, if the value is not set
     */
    public $algorithm;
}

程式碼範例解析

初始化用戶端

關於初始化用戶端的詳細介紹,請參見初始化用戶端

<?php

use AlibabaCloud\Dkms\Gcs\Sdk\Client as AlibabaCloudDkmsGcsSdkClient;
use AlibabaCloud\Dkms\Gcs\OpenApi\Models\Config as AlibabaCloudDkmsGcsOpenApiConfig;


function getDkmsGcsSdkClient()
{
    global $clientKeyContent, $password, $endpoint;

    // 構建KMS執行個體SDK Client配置
    $config = new AlibabaCloudDkmsGcsOpenApiConfig();
    //連線協定請設定為"https"。KMS執行個體服務僅允許通過HTTPS協議訪問。
    $config->protocol = 'https';
    //Client Key。
    $config->clientKeyContent = $clientKeyContent;
    //Client Key口令。
    $config->password = $password;
    //設定endpoint為<your KMS Instance Id>.cryptoservice.kms.aliyuncs.com。
    $config->endpoint = $endpoint;
    // 執行個體CA認證
    $config->caFilePath = 'path/to/caCert.pem';

    // 構建KMS執行個體SDK Client對象
    return new AlibabaCloudDkmsGcsSdkClient($config);
}

調用Sign介面使用非對稱金鑰進行數位簽章

/**
 * 簽名樣本
 * @param AlibabaCloudDkmsGcsSdkClient $client
 * @param string $keyId
 * @param string $message
 * @param string $messageType
 * @param string $algorithm
 * @return SignatureContext
 */
function signSample($client, $keyId, $message, $messageType, $algorithm) {
    // 構建簽章要求
    $signRequest = new SignRequest();
    $signRequest->keyId = $keyId;
    $signRequest->algorithm = $algorithm;
    $signRequest->message = AlibabaCloudTeaUtils::toBytes($message);
    $signRequest->messageType = $messageType;
    $runtimeOptions = new RuntimeOptions();
    // 忽略認證
    //$runtimeOptions->ignoreSSL = true;

    try {
        // 呼叫簽章介面進行簽名
        $signResponse = $client->signWithOptions($signRequest, $runtimeOptions);
        // 密鑰ID
        $keyId = $signResponse->keyId;
        // 簽名值
        $signature = $signResponse->signature;
        // 訊息類型
        $messageType = $signResponse->messageType;
        // 簽名演算法
        $algorithm = $signResponse->algorithm;
        var_dump($signResponse->toMap());
        return new SignatureContext([
            'keyId' => $keyId,
            'signature' => $signature,
            'messageType' => $messageType,
            'algorithm' => $algorithm
        ]);
    } catch (Exception $error) {
        if ($error instanceof \AlibabaCloud\Tea\Exception\TeaError) {
            var_dump($error->getErrorInfo());
        }
        var_dump($error->getMessage());
        var_dump($error->getTraceAsString());
    }
    return null;
}

調用Verify介面使用非對稱金鑰驗證數位簽章

/**
 * 驗簽樣本
 * @param AlibabaCloudDkmsGcsSdkClient $client
 * @param string $message
 * @param SignatureContext $ctx
 * @return bool|null
 */
function verifySample($client, $message, $ctx) {
    // 構建驗簽請求
    $verifyRequest = new VerifyRequest();
    $verifyRequest->keyId = $ctx->keyId;
    $verifyRequest->signature = $ctx->signature;
    $verifyRequest->message = AlibabaCloudTeaUtils::toBytes($message);
    $verifyRequest->messageType = $ctx->messageType;
    $verifyRequest->algorithm = $ctx->algorithm;
    $runtimeOptions = new RuntimeOptions();
    // 忽略服務端認證
    //$runtimeOptions->ignoreSSL = true;

    try {
        // 調用驗簽介面進行驗簽
        $verifyResponse = $client->verifyWithOptions($verifyRequest, $runtimeOptions);
        // 驗簽結果
        $value = $verifyResponse->value;
        var_dump($verifyResponse->toMap());
        return $value;
    } catch (Exception $error) {
        if ($error instanceof \AlibabaCloud\Tea\Exception\TeaError) {
            var_dump($error->getErrorInfo());
        }
        var_dump($error->getMessage());
        var_dump($error->getTraceAsString());
    }
    return null;
}