【问题标题】:Creating your own string of characters as a private key, in public private key encryption?在公共私钥加密中创建自己的字符串作为私钥?
【发布时间】:2016-10-29 15:30:26
【问题描述】:

我们希望将敏感数据加密并存储在数据库中。当用户查看表单时,如果他们有权查看这些敏感数据,他们将拥有一个额外的“密码”,可以为他们的会话解密数据。

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

仅仅使用任何随机字符串作为私钥是行不通的:

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

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

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

【问题讨论】:

  • 如果您(或客户)在任何地方传输私钥,那将违背使用公钥私钥加密的目的。您确定这是解决此问题的最佳解决方案吗?
  • 这个问题没有简单的答案。我建议您就security.stackexchange.com 中使用的算法寻求帮助。您需要 KeyDerivationFunction 从密码中获取密钥并将其与加密算法一起使用。生成密钥对(公共/私有)来加密和解密是一个不同的用例。
  • 详细讨论here。这是可能的,但我不知道有任何 PHP 库支持对 RSA 使用确定性素数搜索。您可以获取 phpseclib 源代码并将其编辑为确定性。
  • 您似乎没有使用公钥/私钥加密的独特属性。似乎使用对称密码(如 AES)和密钥派生函数会更好地满足您的需求。请注意公钥/私钥加密的几个缺点: 1. 它比 AES 慢 100 到 100 倍,并且数据大小受限于密钥大小。它不是更安全。
  • 服务器是否在那一刻决定用户是否有权查看数据,这是了解每个用户,还是提前加密数据并且它是拥有的授予用户访问权限的密码,因此任何发现密码的用户都可以看到数据?

标签: php security encryption


【解决方案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"

这些是 Curve25519 上的 ECDH 密钥,由 libsodium 提供。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-29
    • 2018-02-27
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    相关资源
    最近更新 更多