署名を生成する

# openssl_sign

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

openssl_sign — 署名を生成する

### 説明

function openssl_sign(
string `$data`,
string `&$signature`,
#[\SensitiveParameter]OpenSSLAsymmetricKey|OpenSSLCertificate|array|string `$private_key`,
string|int `$algorithm` = `OPENSSL_ALGO_SHA1`,
int `$padding` = 0
): bool

openssl_sign() は、指定した `data` の署名を作ります。 `private_key` で指定した秘密鍵を使用して、暗号のデジタル署名を生成します。 data 自体は暗号化されないことに注意してください。

### パラメータ

`data`

  署名したいデータの文字列。

`signature`

  成功した場合、署名が `signature` に格納されます。

`private_key`

  OpenSSLAsymmetricKey - openssl_get_privatekey() が返す鍵。

  string - PEM フォーマットの鍵。

`algorithm`

  int - いずれかの 署名アルゴリズム。

  string - openssl_get_md_methods() が返す文字列 ("sha256WithRSAEncryption" や "sha384" など)。

`padding`
  使用する RSA PSS パディング。

### 戻り値

成功した場合に `true` を、失敗した場合に `false` を返します。

### 変更履歴

バージョン | 説明
--- | ---
8.5.0 | オプションのパラメータ `padding` が追加されました。
8.0.0 | `private_key` は、 OpenSSLAsymmetricKey または OpenSSLCertificate クラスのインスタンスを受け入れるようになりました。 これより前のバージョンでは、 `OpenSSL key` または `OpenSSL X.509` 型のリソースを受け入れていました。

### 例

例1 openssl_sign() の例

    <?php
    // $data に署名するデータが含まれていると仮定

    // ファイルから秘密鍵を取得して準備
    $pkeyid = openssl_pkey_get_private("file://src/openssl-0.9.6/demos/sign/key.pem");

    // 署名を計算
    openssl_sign($data, $signature, $pkeyid);

    // メモリからキーを開放する
    openssl_free_key($pkeyid);
    ?>

例2 openssl_sign() の例

    <?php
    // 署名したいデータ
    $data = 'my data';

    // 新しい秘密鍵と公開鍵を作成
    $new_key_pair = openssl_pkey_new(array(
        "private_key_bits" => 2048,
        "private_key_type" => OPENSSL_KEYTYPE_RSA,
    ));
    openssl_pkey_export($new_key_pair, $private_key_pem);

    $details = openssl_pkey_get_details($new_key_pair);
    $public_key_pem = $details['key'];

    // 署名を作成
    openssl_sign($data, $signature, $private_key_pem, OPENSSL_ALGO_SHA256);

    // それらを保存
    file_put_contents('private_key.pem', $private_key_pem);
    file_put_contents('public_key.pem', $public_key_pem);
    file_put_contents('signature.dat', $signature);

    // 署名を検証
    $r = openssl_verify($data, $signature, $public_key_pem, "sha256WithRSAEncryption");
    var_dump($r);
    ?>

### 参考

- openssl_verify() - 署名を検証する

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open