sql >> データベース >  >> RDS >> Mysql

LIBSODIUMは、AES_DECRYPTで行ったように、mysqlクエリ内のデータを復号化します

    LibsodiumはMySQLに組み込まれていないため、AES_ENCRYPT()と同等のものを呼び出すことはできません。 MySQLクエリ内から、期待する結果を取得します。

    ただし、別のアプローチは、CipherSweet のようなライブラリを使用することです。 、検索可能な認証付き暗号化を提供します。 その機能 を必ず理解してください。 および制限 使用を決定する前に。

    <?php
    use ParagonIE\CipherSweet\CipherSweet;
    use ParagonIE\CipherSweet\EncryptedRow;
    use ParagonIE\CipherSweet\Transformation\AlphaCharactersOnly;
    use ParagonIE\CipherSweet\Transformation\FirstCharacter;
    use ParagonIE\CipherSweet\Transformation\Lowercase;
    use ParagonIE\CipherSweet\Backend\FIPSCrypto;
    use ParagonIE\CipherSweet\KeyProvider\StringProvider;
    
    $provider = new StringProvider(
        // Example key, chosen randomly, hex-encoded:
        'a981d3894b5884f6965baea64a09bb5b4b59c10e857008fc814923cf2f2de558'
    );
    $engine = new CipherSweet($provider, new FIPSCrypto());
    
    /** @var CipherSweet $engine */
    $row = (new EncryptedRow($engine, 'contacts'))
        ->addTextField('first_name')
        ->addTextField('last_name')
        ->addFloatField('latitude')
        ->addFloatField('longitude');
    
    // Notice the ->addRowTransform() method:
    $row->addCompoundIndex(
        $row->createCompoundIndex(
            'contact_first_init_last_name',
            ['first_name', 'last_name'],
            64, // 64 bits = 8 bytes
            true
        )
            ->addTransform('first_name', new AlphaCharactersOnly())
            ->addTransform('first_name', new Lowercase())
            ->addTransform('first_name', new FirstCharacter())
            ->addTransform('last_name', new AlphaCharactersOnly())
            ->addTransform('last_name', new Lowercase())
    );
    
    $prepared = $row->prepareRowForStorage([
        'first_name' => 'Jane',
        'last_name' => 'Doe',
        'latitude' => 52.52,
        'longitude' => -33.106,
        'extraneous' => true
    ]);
    
    var_dump($prepared);
    

    これに似たものが表示されるはずです。 [0]の値 変更されますが、[1]の値 しない。これは[0]によるものです (暗号化された一部のフィールド)を含む行データが含まれます。 [1] ブラインドインデックスのみが含まれます(後でSELECTクエリで使用できます)。

    array(2) {
      [0]=>
      array(5) {
        ["first_name"]=>
        string(141) "fips:nrtzoaxvPIOA7jPskWVwJmC0q8WJqrsnqjPh3ifNPsRd2TAx6OwTDfSiMVCXSsSRNQb_nxJlW7TbAtf5UvQRWWKTGhk_kXxpZKdnTrpjbmxi0IgstSrZ126Qz6E0_lvjew0Ygw=="
        ["last_name"]=>
        string(137) "fips:98f5CLB24w0zSqCGPR0D2oq9wQvUwzxo_byAp6mKgMgoJkUHZX1oTtk4Cm8FXI7fsUI8HOG5sKQFGRn6cXMw1EOMGgpXZqiXEDb3jxEbg9s95d4g2NeVd4xs2tmX0xlZ0nSM"
        ["latitude"]=>
        string(145) "fips:d3TVGfnRFlvWxbfihgHqjpXlXU3HtkCAHzM0-4f1l5dAeQf2Vk5RDDVOGMQNM09r0O4UOAub6QTyHGezQ0bWKQ5omqoYCTBJE0Uf_2DSPfO7U4dG74phaP04iFgqpJ8G41q54Kv5t54="
        ["longitude"]=>
        string(145) "fips:IcnUnBZZOxJPYXk-F3v12O_krNb9JsexljiV4gJzgctTpxLFm7ql0tJRF7xP3wLrUtd1VyfYBf75ot7iOSIIIFqsuyKZQdI9UyKbqd87RTMsHbHgPouxgZBg1urlqpuWqbOYEFGiti4="
        ["extraneous"]=>
        bool(true)
      }
      [1]=>
      array(1) {
        ["contact_first_init_last_name"]=>
        array(2) {
          ["type"]=>
          string(13) "w6dsrxbathjze"
          ["value"]=>
          string(16) "546b1ffd1f83c37a"
        }
      }
    }
    

    入力の精度がさまざまであっても、浮動小数点フィールドは常に固定長の出力を生成することに注意してください。これは、攻撃者が暗号文の長さから情報を学習するのを防ぐために意図的に行われます。

    ModernCryptoを選択した場合 FIPSCryptoの代わりに 、上記のすべてはlibsodiumで行われます。それぞれで使用される正確な暗号化は、ここに記載されています です。 、誰かが興味を持っているなら。

    SQLではなくPHPで復号化された値を独自に計算する必要があることに注意してください。

    結局のところ、データベースに保存する前にデータを暗号化することの全体的なポイントは、データベースサーバー(およびそのサーバーを侵害した可能性のある攻撃者)からデータを隠すことです。




    1. MySQLの文字エンコードの変更。データの整合性は維持されていますか?

    2. 前月の合計の新しい列を紹介します

    3. postgresql:.pgpassが機能しない

    4. 複数のカウントとgroupby