Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

LIBSODIUM डेटा को mysql क्वेरी के अंदर डिक्रिप्ट करता है जैसे AES_DECRYPT

लिब्सोडियम MySQL में नहीं बनाया गया है, इसलिए आप AES_ENCRYPT() के बराबर कुछ नहीं कह सकते एक MySQL क्वेरी के भीतर से और अपेक्षित परिणाम प्राप्त करें।

हालांकि, एक वैकल्पिक तरीका CipherSweet जैसी लाइब्रेरी का उपयोग करना है। , जो खोजने योग्य प्रमाणित एन्क्रिप्शन प्रदान करता है। सुनिश्चित करें कि आप इसकी विशेषताओं को समझते हैं और limitations इसका उपयोग करने का निर्णय लेने से पहले।

<?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 . के बजाय , उपरोक्त सभी लिबसोडियम के साथ किया जाएगा। प्रत्येक द्वारा उपयोग किया जाने वाला सटीक एन्क्रिप्शन यहां प्रलेखित है। , अगर कोई उत्सुक है।

ध्यान दें कि आपको SQL के बजाय PHP में डिक्रिप्टेड मानों की अपनी गणना स्वयं करनी होगी।

आखिरकार, डेटा को डेटाबेस में संग्रहीत करने से पहले एन्क्रिप्ट करने का पूरा बिंदु इसे डेटाबेस सर्वर (और कोई भी हमलावर जो उक्त सर्वर से समझौता कर सकता था) से छिपाना है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एक ही डेटाबेस में एकाधिक MySQL तालिकाओं को मैप करने के लिए कॉन्फ़िगरेशन फ़ाइल (.cfg.xml) को हाइबरनेट करें?

  2. वीएस 2017 में ADO.NET इकाई डेटा मॉडल जोड़ना और कुछ नहीं होता है

  3. mysqli में ऑटो-इन्क्रीमेंट के रूप में आईडी के साथ डेटा डालने का उचित तरीका

  4. ऑपरेशन दोहराव में शामिल हों

  5. Google डेटाफ्लो (अपाचे बीम) JdbcIO थोक mysql डेटाबेस में सम्मिलित करें