在公共私钥加密中创建自己的字符串作为私钥?

时间:2016-06-27 14:46:26

标签: php security encryption

我们希望将敏感数据加密并存储在数据库中。当用户正在查看表单时,如果他们被授权查看此敏感数据,他们将有一个额外的密码"这将解密他们的会话数据。

我正在查看公钥/私钥加密,并使用人性化的密码生成私钥(sha hash等)和相应的公钥。公钥将用于加密输入的新敏感数据。如果用户需要查看数据,他们将输入密码("私钥")(除了通常的登录帐户和权限设置)。这也避免了将私钥/密码存储在任何服务器上。

只使用任意随机字符串作为私钥不起作用:

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

因此,用户必须将私钥文本(通过openssl等制作)复制粘贴到提示中以解密信息。这很可能意味着人们将此密钥存储在文件或电子邮件中。

这样的事情可能吗?创建我自己的私钥字符串,然后从那里创建一个公钥?

1 个答案:

答案 0 :(得分:1)

  

这样的事情可能吗?创建我自己的私钥字符串,然后从那里创建一个公钥?

是的,这可能是抽象的。不,这对于需要素数的RSA来说并非微不足道。

来自Halite的示例(不使用RSA,没有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键。