更改用于加密的主密码

问题描述 投票:6回答:3

我想存储一些加密的数据,例如密码管理器,其中主密码解锁所有底层应用程序/站点密码。

环顾四周,我发现了一些像this这样的例子,但他们似乎使用密码作为加密的一部分,类似于哈希中的盐。这意味着要解密您需要完全相同的密码,因此您无法更改密码。从安全性/可用性的角度来看,这似乎并不是很好;如果PW受到损害,您必须在不同的PW下重制整个数据库。

你如何建立一个可以更改主密码的系统?您是否进行了简单的登录检查,然后使用字符串进行加密/解密?静态性质加上该字符串的存储不会不安全吗?

我知道一些PHP和一些微软的Javascript,所以如果你有这些语言的例子会很好,但更高级的解释也非常受欢迎。

javascript php security encryption password-encryption
3个回答
4
投票

有几种方法可行。 Jannes's answer暗示了一个可行的解决方案(虽然提防vulnerabilities in openssl_private_decrypt())。

如果你正在使用Defuse Security's PHP encryption library,密码保护密钥将被抽象掉。 (目前有一个open pull request可以解决使“更改密码”操作无缝且易于使用的问题。)

另见:https://github.com/defuse/php-encryption/blob/master/docs/classes/KeyProtectedByPassword.md

你如何建立一个可以更改主密码的系统?

像这样的东西:

  1. 生成一个强大的随机密钥。我们称之为secret
  2. 从用户的主密码和静态盐(从加密安全随机数生成器生成一次)中获取单独的密钥。我们称之为passwordKeyArgon2id(password, salt) => passwordKey
  3. 使用secret加密passwordKey,使用带随机随机数的安全AEAD模式,并将结果与​​盐一起存储。 $saved = $salt . $nonce . sodium_crypto_secretbox($secret, $nonce, $passwordKey);
  4. 实际数据本身将使用secret加密,而不是passwordKey

如果您需要更改密码,只需使用新密码(和不同的盐)重复步骤2和3。

对于Argon2id,您可以在PHP 7.2及更高版本上使用sodium_crypto_pwhash()


1
投票

您可以使用公钥加密,使用公钥加密数据并使用私钥中的密码进行更改。

一种解决方案是:1)生成rsa私钥和公钥(在Ubuntu上):

openssl genrsa -des3 -out private.key 1024
openssl rsa -in private.key -pubout > public.key

2)使用公钥加密:

$key = file_get_contents('/path/to/public.key');
openssl_public_encrypt("password", $encryptedData, $key);

将$ encryptedData保存到您的数据库(您不能使用此字符串作为密码哈希来匹配登录,因为$ encryptedData在加密之前添加了随机位,您仍然需要使用密码的哈希函数)。

3)使用私钥解密,提供密码:

$key = openssl_pkey_get_private(file_get_contents('/path/to/private.key'), $password);

if($key === false) {
    // false password
    die;
}
openssl_private_decrypt($encryptedData, $decryptedData, $key);

4)更改密码:

openssl rsa -des3 -in private.key -out private.key

这为您提供了两个优势:

  • 独立的加密和解密应用程序,加密不需要私钥或密码。
  • 密码不需要保存在应用程序中。

这将满足您更改密码而不重新加密数据的主要要求。

如果您想进一步保护您的私钥(不允许php直接访问您的私钥,这对您的应用程序被黑客攻击很有用),您可以在系统中创建一个解密服务,您可以使用该服务发送加密数据与密码和获取解密数据。


-1
投票

你有没有考虑过使用GPG?

http://php.net/manual/en/ref.gnupg.php

或libsoduim PECL扩展

https://pecl.php.net/package/libsodium

使用久经考验的加密与滚动您自己的加密将为您节省时间,但可以根据需要保护您的帐户

© www.soinside.com 2019 - 2024. All rights reserved.