Все знают, что не следует хранить в конфигурационных файлах (например 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==)