author: @kawam tags:#rnd,#postgresql,#php


PostgreSQL

PGCrypto

pgcrypto adalah sebuah ekstensi enkripsi untuk PostgreSQL yang menyediakan beberapa fungsi kriptografi untuk mengenkripsi dan mendekripsi data. pgcrypto menggunakan algoritma enkripsi yang terkenal seperti AES, Blowfish, dan RSA, untuk memberikan keamanan yang kuat bagi data sensitif.

Untuk menggunakan pgcrypto di Laravel, Anda perlu menginstal ekstensi “pgcrypto” untuk database PostgreSQL Anda dan mengonfigurasi aplikasi Laravel Anda untuk menggunakan ekstensi tersebut. Berikut adalah langkah-langkah umumnya:

  1. Menginstal ekstensi pgcrypto - Untuk menginstal ekstensi pgcrypto untuk PostgreSQL, Anda dapat menggunakan perintah berikut: CREATE EXTENSION pgcrypto;

  2. Mengonfigurasi Laravel untuk menggunakan pgcrypto - Dalam aplikasi Laravel Anda, Anda dapat menggunakan metode DB::select untuk mengeksekusi query SQL mentah yang termasuk fungsi pgcrypto, seperti pgp_sym_encrypt dan pgp_sym_decrypt. Berikut adalah contoh penggunaannya:

Example:

ALTER TABLE employees ADD COLUMN encrypted_ssn bytea;
 
-- update data and encrypt
UPDATE employees SET encrypted_ssn = pgp_sym_encrypt(ssn, 'my_secret_key', 'AES256');
 
-- select and decrypt
SELECT id, name, email, pgp_sym_decrypt(encrypted_ssn, 'my_secret_key', 'AES256') AS ssn FROM employees;
 

Untuk multiple value:

UPDATE employees 
SET encrypted_ssn = pgp_sym_encrypt(ssn, 'my_secret_key', 'AES256'), 
    encrypted_email = pgp_sym_encrypt(email, 'my_secret_key', 'AES256');

Implementasi dengan Laravel

config file

'pgsql' => [
    'driver' => 'pgsql',
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '5432'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'charset' => 'utf8',
    'prefix' => '',
    'schema' => 'public',
    'sslmode' => 'prefer',
    'options' => [
        \PDO::ATTR_EMULATE_PREPARES => true,
        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
        \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
        \PDO::ATTR_PERSISTENT => true,
        'pgsql_crypto_key' => env('PGSQL_CRYPTO_KEY'),
    ],
],

Contoh query

$results = DB::connection('pgsql')->select("
    SELECT id, name, pgp_sym_decrypt(email, :key) AS email
    FROM users
", ['key' => env('PGSQL_CRYPTO_KEY')]);

Laravel

Encryption - Laravel - The PHP Framework For Web Artisans

encrypt script

<?php
 
namespace App\Http\Controllers;
 
use App\Http\Controllers\Controller;
 
use App\Models\User;
 
use Illuminate\Http\RedirectResponse;
 
use Illuminate\Http\Request;
 
use Illuminate\Support\Facades\Crypt;
 
class DigitalOceanTokenController extends Controller
 
{
 
/**
 
* Store a DigitalOcean API token for the user.
 
*/
 
public function store(Request $request): RedirectResponse
 
{
 
$request->user()->fill([
 
'token' => Crypt::encryptString($request->token),
 
])->save();
 
return redirect('/secrets');
 
}
 
}

decrypt script

use Illuminate\Contracts\Encryption\DecryptException;
 
use Illuminate\Support\Facades\Crypt;
 
try {
 
$decrypted = Crypt::decryptString($encryptedValue);
 
} catch (DecryptException $e) {
 
// ...
 
}