5

非対称暗号化に PHP の OpenSSL モジュールを使用しています。openssl_pkey_new()、openssl_pkey_export()、および openssl_pkey_get_details() を使用して鍵ペアを作成し、openssl_public_encrypt および openssl_private_decrypt() を使用してデータを暗号化および復号化します。

秘密鍵に関連付けられたパスフレーズを変更するにはどうすればよいですか? これは OpenSSL モジュールで可能ですか、それとも新しいキーペアを作成する必要がありますか? これは非常に不便であり、サーバーは定期的に何千ものファイルを再暗号化する必要があります。

ありがとう!

4

2 に答える 2

6

私は夕方に構築している小さなプロジェクトのためにこれを行う必要がありました。

以下が新しい鍵ペア (公開/秘密)を作成することがわかっています。

function newPair (&$private, &$public, $passphrase=null) {
    $res = openssl_pkey_new ();
    if ($res === false) {
        throw new Exception ("Key generation failed: ".openssl_error_string ());
        return false;
    }
    // Sets private by reference
    if (openssl_pkey_export ($res, $private, $passphrase) === false) {
        throw new Exception ("Private key export failed: ".openssl_error_string ());
        return false;
    }
    // Array returns, contains "key" element.
    $public = openssl_pkey_get_details($res);
    if ($public === false) {
        throw new Exception (openssl_error_string ());
        return false;
    }
    $public = $public["key"];
    return true;
}

open_ssl_pkey_export() はパスフレーズの魔法を行います。したがって、パスフレーズを次のように変更できます。

function changePassphrase ($private, $old, $new=null) {
    $res = openssl_pkey_get_private ($private, $old);
    if ($res === false) {
        throw new Exception ("Loading private key failed: ".openssl_error_string ());
        return false;
    }
    if (openssl_pkey_export ($res, $result, $new) === false) {
        throw new Exception ("Passphrase change failed: ".openssl_error_string ());
        return false;
    }
    return $result;
}

ここで行ったことに従ってください... ! (明らかに、例外のスローは純粋にオプションです...コードベースからコードをそのままプルしました。)

changePassphrase() は、現在および新しいパスフレーズとともに、秘密鍵を文字列として受け取ります。openssl_pkey_get_private() を使用して秘密鍵のハンドルを取得し、古いパスフレーズでロックを解除します。

(パスフレーズは秘密鍵を暗号化するために文字通り使用されることに注意してください。これは少しダブルダッチに聞こえるかもしれません![暗号化鍵を暗号化しています... ?!] openssl_pkey_get_private() は、鍵の解釈に失敗した場合に FALSE を返します。パスフレーズが間違っていて、秘密鍵が無効な値に復号化された場合。意味がありますか?)

古いパスフレーズで秘密鍵のロックを解除したら、OpenSSL キー ハンドルを取得し、それを openssl_pkey_export() に渡します。最初に (openssl_pkey_new() を介して) 新しいパスフレーズを提供して作成した後と同じように... -プレスト。

私のコード例がきれいに読めることを願っています。不必要な「圧縮」や省略をせずに、理解しやすく従うのが簡単な方法でコードを記述しようとしました。

幸運を!

于 2013-03-10T20:54:56.833 に答える
0

純粋な PHP RSA 実装である phpseclibを使用します。

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->setPassword('old_password');
$rsa->loadKey('...');

$rsa->setPassword('new_password');
$privatekey = $rsa->getPrivateKey();
$publickey = $rsa->getPublicKey();
?>
于 2012-12-04T21:37:15.733 に答える