2016-06-27 30 views
0

機密データを暗号化してデータベースに保存したいと考えています。また、ユーザーがフォームを表示しているときに、この機密データを表示する権限がある場合は、そのセッションのデータを復号化する追加の「パスワード」を持ちます。独自の文字列を秘密鍵として公開秘密鍵暗号化で作成しますか?

公開鍵/秘密鍵の暗号化を検討していました。秘密鍵(shaハッシュなど)と対応する公開鍵を生成するために人間にやさしいパスワードを使用していました。公開鍵は、入力された新しい機密データを暗号化するために使用される。また、ユーザーがデータを参照する必要がある場合は、(通常のログインアカウントと権限の設定に加えて)パスワード(「秘密キー」)を入力します。これにより、任意のサーバーに秘密鍵/パスワードを格納することも回避されます。

-----BEGIN PRIVATE KEY----- 
sha_hash('myPassword'.$salt) 
-----END PRIVATE KEY----- 

ので、現時点では、ユーザーが解読するために、プロンプトに(のopensslなどを経て作られた)秘密鍵のテキストをコピー&ペーストする必要があります:プライベートキーが動作しないようただ、任意のランダムな文字列を使用して

情報これは、おそらく、人々がこのキーをファイルまたは電子メールに保存することを意味します。

これは可能でしょうか?自分の秘密鍵の文字列を作成し、そこから公開鍵を作成しますか?

+0

あなた(またはクライアント)が秘密鍵をどこにでも送信している場合、その種の秘密鍵は公開秘密鍵暗号化を使用する目的に反します。これがこの問題の最良の解決策であると確信していますか? – apokryfos

+0

この問題には簡単な答えはありません。 http://security.stackexchange.com/で使用されるアルゴリズムの助けを求めることをお勧めします。パスワードから秘密鍵を取得し、暗号化アルゴリズムと共に使用するには、KeyDerivationFunctionが必要です。暗号化と復号化のために鍵のペア(公開鍵/秘密鍵)を生成するのは、別の使用例です。 – pedrofb

+0

これは長さ[ここ](http://crypto.stackexchange.com/q/1662/13022)で議論されています。可能ですが、私はRSAのための決定的な素数検索の使用をサポートするPHPライブラリは知らないです。 phpseclibのソースコードを取り出して確定的に編集することができます。 –

答えて

1

このようなことはありますか?自分の秘密鍵の文字列を作成し、そこから公開鍵を作成しますか?

はい、抽象的に可能です。いいえ、素数を必要とするRSAでは自明ではありません。

$salt = random_bytes(16); // Do this once, then make it a constant 
$keyPair = KeyFactory::deriveEncryptionKeyPair(
    "My password", 
    $salt, 
    false, // This isn't a legacy key 
    KeyFactory::SENSITIVE 
); 
$privateKey = $keyPair->getSecretKey(); 
$publicKey = $keyPair->getPublicKey(); 

var_dump(bin2hex($privateKey->getRawKeyMaterial())); 
var_dump(bin2hex($publicKey->getRawKeyMaterial())); 

出力例:

string(64) "030d6e4c462b2d15a48441cead4d1b9d0ae4a2ea6926a78e180a8b7d3ce6508f" 
string(64) "189c86722bc81550186fd0eaba2a97d2e6c0a9c6f63a098cc1495309c7f9a71e" 

これらはlibsodiumによって提供Curve25519上ECDH鍵は、ある(RSAを使用してRSAなしオフ良好でない)Haliteから

例。