Alqoritm

Jasypt ilə məlumatların encrypt və decrypt edilməsi

jasypt-encrypt-decrypt
Written by Mushfiq Mammadov

Java`da məlumatların encrypt və decrypt edilməsi üçün istifadəsi çox sadə və rahat olan kitabxanalardan biri Jasypt kitabxanasıdır. Bu kitabxana vasitəsilə çox sadə şəkildə öz şəxsi “açar”ınız ilə məlumatları encrypt edə və həmin açar vasitəsi ilə də encrypt edilmiş məlumatı decrypt edə bilərsiniz.

Kitabxananı maven proyektə əlavə etmək üçün:

<dependency>
    <groupId>org.jasypt</groupId>
    <artifactId>jasypt</artifactId>
    <version>1.9.2</version>
</dependency>

Kod nümunəsi:

package az.mm.jasypt;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.jasypt.util.text.BasicTextEncryptor;

/**
 *
 * @author MM <[email protected]>
 */
public class TestJasypt {
    
    private static char[] password;

    static {
        try (InputStream in = TestJasypt.class.getClassLoader().getResourceAsStream("app.properties");) {
            Properties props = new Properties();
            props.load(in);
            password = props.getProperty("password").toCharArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        String text = "This is my private data";
        String encrypt = encrypt(text);
        String decrypt = decrypt(encrypt);
        System.out.println("\noriginal: " + text);
        System.out.println("\nencyrpt:  " + encrypt);
        System.out.println("\ndecyrpt:  " + decrypt);
    }

    private static String encrypt(String text) {
        BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
        textEncryptor.setPasswordCharArray(password);
        String encryptedText = textEncryptor.encrypt(text);

        return encryptedText;
    }

    private static String decrypt(String text) {
        BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
        textEncryptor.setPasswordCharArray(password);
        String decryptedText = textEncryptor.decrypt(text);

        return decryptedText;
    }
    
    public static char[] getPassword() {
        return password;
    }
    
}

 

Output:

original: This is my private data

encyrpt:  rS+kUNDW0zvJCzWkKlaVgDdHuOfYawKMH+/JvDQQmQY=

decyrpt:  This is my private data

 

Bəs bunu praktikada necə istifadə etmək olar?

Yerindən asılı olaraq bu şifrələmənin fərqli cür tətbiqləri ola bilər, amma burada müşahidəmdən bir nüansı qeyd edəcəm. Qısa bir müddət öncə bir məsələni araşdırarkən Google play store`da qarşıma bir application çıxdı, mənim araşdırdığım məsələ ilə əlaqədar deyildi, amma diqqətimi çəkdi yüklədim yoxladım. Deməli bu app telefonunuzda olan digər android app`ları decompile edir və source kodlarını sizə göstərir (pis yaxud yaxşı orasını deyə bilmərəm).

Adını qeyd etməyəcəm, telefonumda bir mobil application var idi, bir neçə ay öncə onun istifadə etdiyi servis mənə lazım idi, bir alqoritmi test etmək üçün. Maraq üçün həmin application-u bu proqram vasitəsilə decompile etdim və source kodlarına baxmağa başladım. Bir neçə dəqiqədən sonra servisin url-ini kodların içindən tapdım. Url-i yoxladım, çox gözəl şəkildə işləyirdi 🙂 Amma istifadə etmədim, çünki bilirəm adamlar o servisi yazmaq üçün nə qədər əziyyət çəkiblər. Və bunu şəxsi məqsədləri üçün ediblər, API public deyil, onu istifadə etmək yaxud yaymaq ədalətli olmaz. Etiraf edək ki, bəlkə də çoxlarımız mobil app-ın daxilində istifadə edəcəyimiz servisin url-ini aşkar şəkildə qeyd edirik. Mənim özüm də bunu bir dəfə etmişəm, ona görə kiminsə də bunu edəcəyini güman edib maraq üçün yoxlamağa başlamışdım 😀

 

Yəqin bu boşluğu aradan qaldırmaq üçün də yöntəmlər var, mobil developerlər daha yaxşı bilər. Amma Jasypt kitabxanasını görəndə ağlıma sadə bir fikir gəldi: veb servisin verdiyi jsonu şifrələyib göndərmək və klient tərəfdə də eyni açar söz ilə deşifrə edib sonra parse etmək. Belə olan halda public olmayan servisin birbaşa istifadəsinin qarşısını almaq, başqa sözlə əlçatanlığını daha çətinləşdirmək olar. Düzdü bunun dezavantajları da çox ola bilər; deşifrələmə üçün əlavə vaxt itkisi, androidin Jasypt-ni dəstəkləyib dəstəkləməməsi, şifrələmə üçün istifadə olunan açar sözün əldə edilməsi ilə şifrələnmiş jsonun deşifrə edilə bilinməsi və s.

Dərinə getdikdə daha çox mətləblər ortaya çıxır, ona görə də çox dərinə getməyəcəm. Sadəcə bu bir fikir olaraq ağlıma gəldi və kodlaşdırılması sadə olduğundan bir nümunə götürüb yüngül cızma-qara edib əlavə etdim bloga. Nə vaxtsa bu məsələ aktual olsa yenidən qayıdıb daha əhatəli şəkildə baxmaq olar.

 

Servis nümunəsi:

Controller.java

@RestController
public class Controller {

    @GetMapping("/currency/rates")
    public String getRates() {
        
        List<Currency> rates = new ArrayList();
        Rate rateUSD = new Rate();
        rateUSD.setEUR("0.81307");
        rateUSD.setGBP("0.71502");
        rateUSD.setJPY("106.74");
        rateUSD.setRUB("56.466");
        rateUSD.setTRY("3.7869");
        
        Currency currency1 = new Currency();
        currency1.setBase("USD");
        currency1.setDate(LocalDate.now().toString());
        currency1.setRate(rateUSD);
        rates.add(currency1);
        
        Rate rateRUB = new Rate();
        rateRUB.setEUR("0.014399");
        rateRUB.setGBP("0.012663");
        rateRUB.setJPY("1.8903");
        rateRUB.setUSD("0.01771");
        rateRUB.setTRY("0.067065");
        
        Currency currency2 = new Currency();
        currency2.setBase("RUB");
        currency2.setDate(LocalDate.now().toString());
        currency2.setRate(rateRUB);
        rates.add(currency2);

        String json = new Gson().toJson(rates);
        System.out.println("gson output: " + json);
        
        BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
        textEncryptor.setPasswordCharArray("mySecretKey".toCharArray());
        String encryptedJson = textEncryptor.encrypt(json);
        
        return encryptedJson;
    }

}

 

Currency.java

public class Currency {
    private String base;
    private String date;
    private Rate rate;

    public Currency() {
    }

    public Currency(String base, String date, Rate rate) {
        this.base = base;
        this.date = date;
        this.rate = rate;
    }

    public String getBase() {
        return base;
    }

    public void setBase(String base) {
        this.base = base;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public Rate getRate() {
        return rate;
    }

    public void setRate(Rate rate) {
        this.rate = rate;
    }
    
}

 

Rate.java

public class Rate {
    
    private String USD, EUR, GBP, JPY, RUB, TRY;

    public Rate() {
    }

    public String getUSD() {
        return USD;
    }

    public void setUSD(String USD) {
        this.USD = USD;
    }

    public String getEUR() {
        return EUR;
    }

    public void setEUR(String EUR) {
        this.EUR = EUR;
    }

    public String getGBP() {
        return GBP;
    }

    public void setGBP(String GBP) {
        this.GBP = GBP;
    }

    public String getJPY() {
        return JPY;
    }

    public void setJPY(String JPY) {
        this.JPY = JPY;
    }

    public String getRUB() {
        return RUB;
    }

    public void setRUB(String RUB) {
        this.RUB = RUB;
    }

    public String getTRY() {
        return TRY;
    }

    public void setTRY(String TRY) {
        this.TRY = TRY;
    }
    
}

 

Client nümunəsi :
public class DecryptJson {

    public static void main(String[] args) {
        String encryptedJson = readJsonFromUrl("http://localhost:1717/currency/rates");
        String json = decrypt(encryptedJson);
        
        System.out.println("encryptedJson: " + encryptedJson);
        System.out.println("decryptedJson: " + json);
    }


    private static String decrypt(String text) {
        BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
        textEncryptor.setPasswordCharArray(TestJasypt.getPassword());
        String decryptedText = textEncryptor.decrypt(text);

        return decryptedText;
    }

    
    private static String readJsonFromUrl(String url) {
        StringBuilder sb = new StringBuilder();
        try (InputStream is = new URL(url).openStream();
             BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));) {

            int cp;
            while ((cp = rd.read()) != -1) 
                sb.append((char) cp);

        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return sb.toString();
    }
    
}

 

Output:

encryptedJson: WMCWw+JeRmlcSXVodBTufNxGgaX4s80ZNkFDnuaYRExINOLoVbflrAKhVH97/aTsmq57PYZArUG+ioxvCZvpSU6kOlL52rktveBy6ozJP9Wm9h4zQAeldpcu3TYgYdKw+ctUyIR8kKjYudB4oieXP7UWUGo+NX3UWDIJ78fx8m7P4RwkC1Llxbem5hynAV+8FeppYl/5gX0L+o4up1f09DBDzvz1TYfdj7gwuIX3WmWkOuh5d92SLG5kgS1jE8Xn+tEz1Lc/y1LngxT9XGUM+B7zYEic+ZXpd204Yx13o3mwgue3weSolY/glbR9iZ0bZu5q4JkJ7WBnmE0N2W52qSle+M9yJ+FJ

decryptedJson: [{"base":"USD","date":"2018-02-25","rate":{"EUR":"0.81307","GBP":"0.71502","JPY":"106.74","RUB":"56.466","TRY":"3.7869"}},{"base":"RUB","date":"2018-02-25","rate":{"USD":"0.01771","EUR":"0.014399","GBP":"0.012663","JPY":"1.8903","TRY":"0.067065"}}]

İstifadə edilən kodların github linkləri:

Mövzu ilə əlaqəli digər linklər:

 

About the author

Mushfiq Mammadov

Leave a Comment


The reCAPTCHA verification period has expired. Please reload the page.

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.