Showing posts with label encryption. Show all posts
Showing posts with label encryption. Show all posts

Decrypt base64 Data Di Linux

Wednesday, February 08, 2017

Bila guna bash script, dan perlu sorokkan password, boleh guna encrypt base64, kemudian decrypt balik

#!/bin/sh

username='my_username'
password='my_password'

username_encoded=$(echo -n "$username" | openssl enc -base64)
password_encoded=$(echo -n "$password" | openssl enc -base64)

username_decoded=$(echo "$username_encoded" | openssl enc -d -base64)
password_decoded=$(echo "$password_encoded" | openssl enc -d -base64)

echo "username: $username"
echo "username_encoded: $username_encoded"
echo "username_decoded: $username_decoded"
echo "password: $password"
echo "password_encoded: $password_encoded"
echo "password_decoded: $password_decoded"
Output:
username: my_username
username_encoded: bXlfdXNlcm5hbWU=
username_decoded: my_username
password: my_password
password_encoded: bXlfcGFzc3dvcmQ=
password_decoded: my_password
Bila encode, ada hantar newline. Bila decode, tak new line, tak payah guna -n pada echo.
Contoh bila nak guna. Setkan awal-awal, hasilnya, masukkan dalam script untuk di decode kan semula.
mygpis@mygpis-db:~$ echo -n "mysecpassword" | openssl enc -base64
TXlHUElTMTIz
mygpis@mygpis-db:~$ vi task.sh

#!/bin/bash

DBHOST='localhost'
DBUSRN='root'
#DBPASS='mysecpassword'#commentkan
DBNAME='mygpis'
DBPASS=$(echo "TXlHUElTMTIz" | openssl enc -d -base64)

Manipulasi Data Pada Blok Array Yang Terpilih

Sunday, October 12, 2014

Kita ada beberapa blok data di dalam satu array, dan hanya beberapa blok terpilih sahaja yang kita mahu manipulasi.

Contoh, katakan di bawah ini ada 10 array yang menyimpan data pekerja. Data yang disimpan adalah, IC, Nama, Alamat, Notelefon, Umur, Bandar, Poskod, Negeri, Jawatan, dan kenderaan.

Terdapat dua (2) data yang hendak dimanipulasi/encrypt iaitu Nama, dan Notelefon.

array semuafield = {IC, Nama, Alamat, Notelefon, Umur, Bandar, Poskod, Negeri, Jawatan, kenderaan}
array selectfield = {Nama, Notelefon}

Contoh data:

 IC | Nama | Alamat | Notelefon | Umur | Bandar | Poskod | Negeri | Jawatan | kenderaan  
 9801 | Faaris | Taman PP | 123 | 27 | Puchong | 56000 | Selangor | CEO | Kereta  
 0102 | Saajidah | Taman PP | 456 | 24 | Puchong | 56000 | Selangor | COO | Kereta  

Nilai g = 10; //jumlah array untuk 'semuafield'
Nilai a = 2; //jumlah array untuk 'selectedfield'

* Sekadar nota (sila abaikan): Data ini diambil dari database postgres, dijalankan menggunakan C++. Data yang terhasil dan yang telah dimanipulasi, akan disimpan ke dalam file data.txt dalam bentuk csv format.

Di bawah adalah contoh source code asal.

 ofstream myfile ("data.txt", std::ios_base::app);  
 if (myfile.is_open())  
 {  
   d = 0;  
   result Rp( Z.exec( sqlp ));  
   for (result::const_iterator c = Rp.begin(); c !=Rp.end(); ++c, d++) {  
    int count;  
    for (int k=0; k < g; k++)  
    {  
     count=0;  
     for (int m=0; m < a; m++)  
     {  
       if (selectfield[m] == semuafield[k])  
        {  
         myfile << mimos_init(&chipper_mimos, c[semuafield[k]], cipher_id, key, 16);  
        } else {  
        myfile << c[semuafield[k]].as<string>();  
       }  
      }  
     if(k < (g-1))  
      {  
       myfile << ", ";  
      }  
    }  
    myfile << "\n";  
   }  
  myfile.close();  
  }  
  else cout << "Unable to open file";  


* Sekadar nota (sila abaikan):
if(k < (g-1)) { myfile << ", "; } dan "\n" untuk memenuhi format CSV file. Tanda koma (,) memisahkan antara blok data dan tanda \n untuk membina newline pada baris data baru.

Secara logik mudah, code ini tiada masalah kerana pada gelung pertama, for (k < g), kita sudah keluarkan semua data satu persatu. Kemudian, di dalamnya kita buat checking untuk 'selectedfield' pula. Lihat pada gelung for (m < a) yang berada di dalam gelung yang awal. Di dalam gelung (m < a) ini, kita akan buat checking, jika terjumpa data di dalam blok 'selectedfield', kita akan mula encryptkan data tersebut sebelum dimasukkan ke dalam file. Jika tidak, data akan dimasukkan terus ke dalam file tanpa apa-apa manipulasi.

    for (int k=0; k < g; k++)  
    {  
     count=0;  
     for (int m=0; m < a; m++)  
     {                        
       if (selectfield[m] == semuafield[k])  
        {  
         myfile << mimos_init(&chipper_mimos, c[semuafield[k]], cipher_id, key, 16);  
        } else {  
        myfile << c[semuafield[k]].as<string>();  
       }  
      }  
     if(k < (g-1))  
      {  
       myfile << ", ";  
      }  
    }  
    myfile << "\n";  

Tetapi, hasil yang kita dapat tidak menepati syarat. Datanya bertindih dan seolah-oleh encryption berjalan secara tidak konsisten

 9801, uYnudWRXUlhVbGhWYkdoVw==Faaris, Taman PP, 123+4RSU1UxVXhWWGhXV0doWA==, 27, Puchong, 56000, Selangor, CEO, Kereta  
 0102, +4RSU1UxVXhWWGhXV0doWA==Saajidah, Taman PP, 456+4RSU1UxVXhWWGhXV0doWA==, 24, Puchong, 56000, Selangor, COO, Kereta  


Jika diperhatikan, pada nilai yang dapat, ada data berulang. Contoh:

uYnudWRXUlhVbGhWYkdoVw==Faaris

uYnudWRXUlhVbGhWYkdoVw== adalah satu nilai. Faaris adalah satu nilai yang lain. Tetapi keduanya bercantum menjadi satu.

Ini kerana, nilai a=2, dan gelung pada a akan berjalan sebanyak 2 kali. Semakan kali pertama, ia memberi nilai uYnudWRXUlhVbGhWYkdoVw==, dan semakan kali kedua, diberi nilai Faaris.

Ini berlaku kerana selepas checking berlaku dan berjumpa dengan apa yang hendak di cari, gelung berjalan sekali lagi seperti biasa. Bagi mengatasi masalah ini, setiap kali gelung membuat semakan, gunakan fungsi break. Lihat kod di bawah (dengan beberapa perubahan berbanding kod di atas tadi.)

 if (myfile.is_open())  
 {  
   d = 0;  
   result Rp( Z.exec( sqlp ));  
   for (result::const_iterator c = Rp.begin(); c !=Rp.end(); ++c, d++) {  
    int count;  
    for (int k=0; k < g; k++)  
    {  
     count=0;  
     for (int m=0; m < a; m++)  
     {  
      if (c[semuafield[k]].size()==0)  
      {  
       myfile << "NULL";  
       break;  
      }  
       if (selectfield[m] == semuafield[k])  
        {  
         myfile << mimos_init(&chipper_mimos, c[semuafield[k]], cipher_id, key, 16);  
         break;  
        } else {  
        count++;  
        //myfile << c[semuafield[k]].as();  
        //break;  
       }  
        if (count == a)  
        myfile << c[semuafield[k]].as();  
      }  
     if(k < (g-1))  
      {  
       myfile << ", ";  
      }  
    }  
    myfile << "\n";  
   }  
  myfile.close();  
  }  
  else cout << "Unable to open file";  

MySQL 5.5 Encode Base64

Monday, July 01, 2013

Seringkali pengguna MySQL version 5.5 dan ke bawah mengalami masalah apabila sesuatu data itu perlu diencode atau sebaliknya. Masalah MySQL tidak menyediakan fungsi tersebut.

Secara defaultnya ketika ini, apabila kita membuat installation, MySQL akan memberikan kita versi 5.5.

Jika mahu menggunakan fungsi encode base64, MySQL sediada perlu ditukar kepada MySQL version 5.6.

Ada sesetengah orang, mereka mahu menggunakan MySQL version sedia ada. Jadi, mereka perlu menambah function tersebut ke dalam application MySQL.

Kita tidak perlu susah berfikir bagaimana untuk membuat coding dan compile ke dalam aplikasi tersebut. Guna sahaja apa yang telah disediakan oleh Y.Kentaro ini.

Ini Sesuai untuk pengguna Linux.

Cara untuk install. Pada paparan terminal, download dan compile code tersebut.

 $ git clone https://github.com/y-ken/mysql-udf-base64.git  
 $ cd mysql-udf-base64  
 $ gcc -Wall -fPIC -I/usr/local/include -shared base64.c -o base64.so  
 $ sudo install -m 755 base64.so `mysql_config --plugindir`  


Selesai install, kita perlu cipta function tersebut ke dalam MySQL.

Masuk pula ke dalam application.

 mysql> CREATE FUNCTION base64encode RETURNS STRING SONAME 'base64.so';  
 mysql> CREATE FUNCTION base64decode RETURNS STRING SONAME 'base64.so';  


Selepas itu, kita boleh cuba melihat keberkesanannya.

 mysql> SELECT base64encode(nama) FROM tablesample;  


Sedikit Masalah Setelah dicuba, memang ianya berjaya. Tetapi masalah timbul, bila proses ini dilakukan bersama dengan encryption aes, hasilnya tidak dapat seperti data asal.

Contoh Encode:
 select base64encode(aes_encrypt('firdaus', 111)) from dual;  

 Result:   IcCTWM8Recp QE HRTBQ==   

Decode:
 select base64encode(aes_encrypt(' IcCTWM8Recp QE HRTBQ==', 111)) from dual;  

 Result: WC8ARIk1 q5+ gVKcUZcSQCU mEkCQAN b9x NR8LvA=  


Mungkin terdapat beberapa perkara yang saya terlepas pandang. Jadi, masalah ini akan saya lihat kemudian.


Peringatan: Semasa kita buat installation MySQL, kita perlu install MySQL library untuk development. Jika tidak, compilation akan gagal dan keluar error.
untuk install, hanya dapatkan sahaja dari repository.
 $ apt-get install libmysqlclient-dev  

Rujukan: https://github.com/y-ken/mysql-udf-base64