Php 加密mysql数据库

Php 加密mysql数据库,php,mysql,encryption,anonymize,Php,Mysql,Encryption,Anonymize,我正试图为那些存储客户机密数据的用户建立一个平台。上下文非常简单:法国法律禁止我访问我的用户将存储的数据(例如患者的医疗记录) 因此,当用户提交将存储在数据库中的数据时,他应该是唯一能够访问该信息的人。比如用他的密码加密。这样,如果我登录mysql,我只会看到加密的无意义数据,没有可读数据 我的哲学可能是错误的,那就是从实践中学习。希望你们能接受我的方法 问题是:我不知道从哪里开始,怎么做。。。甚至连在谷歌上搜索什么都没有。例如,我甚至试图在codecanyon.net上找到一些合适的东西,但却

我正试图为那些存储客户机密数据的用户建立一个平台。上下文非常简单:法国法律禁止我访问我的用户将存储的数据(例如患者的医疗记录)

因此,当用户提交将存储在数据库中的数据时,他应该是唯一能够访问该信息的人。比如用他的密码加密。这样,如果我登录mysql,我只会看到加密的无意义数据,没有可读数据

我的哲学可能是错误的,那就是从实践中学习。希望你们能接受我的方法

问题是:我不知道从哪里开始,怎么做。。。甚至连在谷歌上搜索什么都没有。例如,我甚至试图在codecanyon.net上找到一些合适的东西,但却不喜欢任何相关的脚本

提前感谢:)


PS:我实际上也会有同样的文件问题(jpg、word、pdf、xls……这对用户来说应该足够了)。但那是另一回事。

虽然我不熟悉法国的数据保护法,但我确实对欧盟的一般立法有一些经验。可能你必须在你的系统中加密个人数据,这样就无法识别此人。这意味着,技术数据(如表中的系统特定id)可以保持未加密状态。这是我相信你能成功的唯一原因。某种程度上。您必须与律师合作,以确定哪些数据可以保持未加密状态,以符合法律规定,并且仍然能够为您的客户提供有价值的服务

但是,我认为您遗漏了一个重要的要点:如果您无法访问某些数据,则这些数据不得以普通格式送达您的组织。时期如果有,那么您已经可以访问它了。因此,php(或任何基于服务器的加密)或基于mysql的加密解决方案都是不可能的

我能想到的唯一解决方案是与第三方PKI提供商合作,后者将为您的客户提供证书(可能是芯片卡),应用程序的客户端在将客户机上的敏感个人数据项发送到服务器之前对其进行加密,并在客户机上解密这些数据项。这也意味着如果你想让这个系统基于web,你必须在客户端使用一些插件。您可能需要一些已签名的java应用程序来管理读卡器和证书

此设置对您的客户端有两个缺点:

  • 由于PKI提供商必须是独立的第三方,因此他们与之打交道的不是单一的提供商。您不能管理证书
  • 如果存储的数据损坏,加密的数据将丢失。因此,您必须实施一些疯狂的备份和恢复解决方案

  • 假设问题如下:

    • 您需要在存储数据之前对其进行加密
    • 你不应该有解密它的密钥,只需要加密它
    实际上有一个工具可以实现这一点:它被称为a,可以通过OpenSSL或LibNasdaq来实现

    使用libnaude在PHP中密封/解封数据 使用OpenSSL在PHP中密封/解封数据 用法示例
    演示:

    事实上,我也参与了一个类似的项目,我试图在MySQL服务器中构建一个安全的数据库,该数据库对于运行所有有效的SQL查询也很有用。它仍在进行中,困难太多;我接受

    但是,对于您的问题,您似乎只需要对值进行加密和解密,而不希望将密钥也存储在数据库中。对我来说,有两种方式浮现在我的脑海中:

  • 第一种方法是,您决定一个固定的密钥来加密和解密这些值,并将其用于存储在数据库中的每个数据。
    但是,我想这是不实际的,因为这种方法的安全性变得很弱,人们可以用暴力方法识别你的密钥

  • 第二种方法是,在注册时为每个不同的用户生成一个随机密钥。不同用户的数据只能由拥有解密密钥的用户查看,这里只有用户拥有。然后在这之后应用第一种方法。i、 例如,您决定一个密钥,该密钥将用于加密不同用户的这些密钥。然后将此加密密钥存储在数据库中的单独表中。因此,当用户下次尝试访问其数据时,其输入的密钥(可能是密码)将使用您确定的静态密钥进行加密,如果在数据库的表中找到此加密密钥,您将获取该用户的数据,使用其密钥解密并显示给他/她。
    您只需要一个,
    (i) 要选择编程平台,JAVA是最好的。
    (ii)学习如何用这种编程语言使用数据库,MySQL服务器是一个很好的选择。 (iii)和一个好的加密算法来实现


  • 希望,我没有因为这个答案而让你生气:)干杯。

    这是一个非常棘手的问题。加密数据相对容易,因此很难解密(即,散列密码并存储散列,很难恢复到明文密码),但加密数据时,即使开发人员也无法读取数据,但一个用户可以读取数据,这很复杂。也许可以看看苹果用什么算法来加密数据——因为他们声称即使他们把你的数据给了政府,他们也无法为他们解密。@kvother有道理。也许苹果无法解密iPhone的原因可能会有所帮助。假设你做到了,那么你将是知道如何加密数据的人(你使用的方法或方法是什么),然后你也将是知道如何解密的人,所以法国法律仍然会有问题,这只是一个小问题thought@EvanCarslake我认为OP关注的是所有数据的加密,而不是
    $store_me = \Sodium\crypto_box_seal(
        $plaintext,
        $recipient_public_key
    );
    
    $visible = \Sodium\crypto_box_seal_open(
        $store_me,
        $recipient_keypair
    );
    
    /**
     * A human-usable variant of openssl_seal()
     * 
     * @param string $plaintext Your message
     * @param string $publickey_string PEM-encoded RSA public key
     * @param boolean $encode Hex-encode the output?
     * 
     * @return string
     */
    function easy_seal($plaintext, $publickey_string, $encode = false)
    {
        $pubkey = openssl_get_publickey($publickey_string);
        if ($pubkey === false) {
            throw new Exception('Could not load public key');
        }
        $sealed = '';
        $ekeys = [];
        $result = openssl_seal($plaintext, $sealed, $ekeys, [$pubkey]);
        if ($result === false) {
            throw new Exception('openssl_seal failed!');
        }
        if ($encode) {
            return json_encode([
                bin2hex($sealed), 
                bin2hex($ekeys[0])
            ]);
        }
        return json_encode([$sealed, $ekeys[0]]);
    }
    
    /**
     * Inverse operation of easy_seal()
     * 
     * @param string $ciphertext (the output of easy_seal())
     * @param string $privatekey_string PEM-encoded RSA private key
     * @param boolean $encoded Do we need to decode from hex?
     * 
     * @return string
     */
    function easy_unseal($ciphertext, $privatekey_string, $encoded = false)
    {
        list($sealed, $ekey) = json_decode($ciphertext, true);
        if ($encoded) {
            $sealed = hex2bin($sealed);
            $ekey = hex2bin($ekey);
        }
        $open_data = '';
        $privkey = openssl_get_privatekey($privatekey_string);
        if ($privkey === false) {
            throw new Exception('Could not load public key');
        }
    
        $result = openssl_open($sealed, $open_data, $ekey, $privkey);
        if ($result === false) {
            throw new Exception('openssl_open failed!');
        }
        return $open_data;
    }
    
    $public_key = file_get_contents('/path/to/publickey.pem');
    $plaintext = 'Something something dark side';
    $store_me = easy_seal($plaintext, $public_key);
    
    // Elsewhere: 
    $secret_key = file_get_contents('/path/to/secretkey.pem');
    $visible = easy_unseal($store_me, $secret_key);