EncryptableProperties и защита от дурака


Все знают, что не следует хранить в конфигурационных файлах (например properties) критически важную информацию в открытом виде.
Например логины и пароли от базы данных, почты и т.д.
Не стоит этого делать, т.к. “случайный” сисадмин или пользователь сможет открыть этот ваш файлик и увидеть пароль.

С учетом того, что довольно часто пароли придумывают люди, то запомнить их бывает очень просто.
Более того, некоторые пароли настолько поражают воображение, что их очень сложно забыть. Как правило они выглядят так: 123456, sa, manager и т.д…
Конечно это личное дело каждого, но выставлять на обозрения такие свои пароли, как-то не совсем прилично.

Если все-таки нет желания сильно напрягаться и прятать пароли в действительно укромные места, можно довольно просто сделать “защиту от дурака” (чтобы пароль явно не читался).

Как вариант можно использовать Jasypt. Этот довольно большой проект и его можно использовать и в других целей, но мы будем разбирать простой и конкретный случай: предотвратить хранение паролей в открытом виде в properties файле.
Главное, что нужно понимать, мы не строим защиту от серьезного злобного хакера, а делаем простую защиту от дурака!

Для этого:
Прописываем в pom.xml зависимость:

    
      org.jasypt
      jasypt
      1.7.1
    

Если не maven, то можно просто скачать и подключить библиотеку с сайта. В любом случае, Jasypt удобен тем, что дополнительные зависимости не тянутся. Конечно, если нужна серьезная криптография, нужно будет кое-что доставить, но в нашем простом случае она нам не нужна. Мы просто хотим сделать так, чтобы пароль не смогли “тупо прочитать”.

Дальше читаем учебник: http://www.jasypt.org/encrypting-configuration.html

Для того, чтобы спрятать пароль, можно воспользоваться утилитой командой строки. Идет вместе с дистрибутивом Jasypt. Находится в директории bin.
Например:

jasypt-1.7.1\bin>encrypt.bat input=manager password=trololo
...
----OUTPUT----------------------
R+1ZbGFUdbNYXLJHdqgzVw==
...

Зашифрованное значение свойства, которое нужно спрятать оборачивается в ENC(). Пример:

# Допустим сохраняем в файл /tmp/a.properties
username=system
password=ENC(R+1ZbGFUdbNYXLJHdqgzVw==)

Теперь чтобы получить содержимое, воспользуемся примером из учебника:

import java.util.Properties;
import java.io.FileInputStream;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.properties.EncryptableProperties;
public class PropApp {
    public static void main(String[] args) throws Exception {
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        // выставляем пароль для всего нашего EncryptableProperties: trololo
        encryptor.setPassword("trololo");
        Properties props = new EncryptableProperties(encryptor);
        props.load(new FileInputStream("/tmp/a.properties"));
        // логин не замаскирован
        String datasourceUsername = props.getProperty("username");
        // system
        System.err.println("datasourceUsername = " + datasourceUsername); 
        // пароль будет расшифрован на лету
        String datasourcePassword = props.getProperty("password");
        // manager
        System.err.println("datasourcePassword = " + datasourcePassword); 
    }
}

Важно:

  • Легко видеть, что jasypt-овый EncryptableProperties является наследником обычного Properties. Таким образом, вы можете обращаться с ним как с обычным Properties.
  • EncryptableProperties меняет только метод getPropertу(), но не метод get(), который достался от Hashtable. Например, если в приведенном выше примере, вы вызовите метод props.get(“password”), то получите ENC(R+1ZbGFUdbNYXLJHdqgzVw==)
Любое использование либо копирование материалов или подборки материалов сайта, элементов дизайна и оформления допускается лишь с разрешения правообладателя и только со ссылкой на источник: programador.ru

Телеграм канал: @prgrmdr
Почта для связи: vit [at] programmisty.com