Как избежать хранения паролей в открытом виде для tomcat server.xml Определение ресурса DataSource?

Событие в .net - это назначенная комбинация метода Add и метода Remove, оба из которых ожидают определенного типа делегата. Оба C # и vb.net могут автоматически генерировать код для методов добавления и удаления, которые будут определять делегата для хранения подписки на события и добавлять / удалять переданные в делегате в / из этого делегата. VB.net также будет автоматически генерировать код (с инструкцией RaiseEvent) для вызова списка подписки тогда и только тогда, когда он не пуст; по какой-то причине C # не генерирует последнее.

Обратите внимание, что, хотя для управления подписками на события используется многоадресный делегат, это не единственный способ сделать это. С публичной точки зрения потенциальный подписчик событий должен знать, как позволить объекту знать, что он хочет получать события, но ему не нужно знать, какой механизм издатель будет использовать для повышения событий. Обратите также внимание на то, что, хотя кто-то, кто определил структуру данных событий в .net, по-видимому, думал, что должно быть общедоступное средство для их повышения, ни C #, ни vb.net не используют эту функцию.

37
задан Ahmed Ashour 22 June 2016 в 08:25
поделиться

3 ответа

Как сказано прежде, чем зашифровать пароли просто перемещает проблему где-то в другом месте.

Так или иначе, это довольно просто. Просто запишите класс со статическими полями для Вашего секретного ключа и так далее и статические методы зашифровать, дешифровать Ваши пароли. Зашифруйте свой пароль в конфигурационном файле Tomcat (server.xml или yourapp.xml...) использующий этот класс.

И дешифровать пароль "на лету" в Tomcat, расширьте DBCP's BasicDataSourceFactory и используйте эту фабрику в своем ресурсе.

Это будет похоже:

    <Resource
        name="jdbc/myDataSource"
        auth="Container"
        type="javax.sql.DataSource"
        username="user"
        password="encryptedpassword"
        driverClassName="driverClass"
        factory="mypackage.MyCustomBasicDataSourceFactory"
        url="jdbc:blabla://..."/>

И для пользовательской фабрики:

package mypackage;

....

public class MyCustomBasicDataSourceFactory extends org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory {

@Override
public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment) throws Exception {
    Object o = super.getObjectInstance(obj, name, nameCtx, environment);
    if (o != null) {
        BasicDataSource ds = (BasicDataSource) o;
        if (ds.getPassword() != null && ds.getPassword().length() > 0) {
            String pwd = MyPasswordUtilClass.unscramblePassword(ds.getPassword());
            ds.setPassword(pwd);
        }
        return ds;
    } else {
        return null;
    }
}

Hope это помогает.

39
ответ дан Ahmed Ashour 22 June 2016 в 08:25
поделиться

Tomcat должен знать, как соединиться с базой данных, таким образом, этому нужен доступ к незашифрованному паролю. Если пароль в зашифрованном, Tomcat должен знать, как дешифровать его, таким образом, Вы только перемещаете проблему где-то в другом месте.

настоящая проблема: кто может получить доступ server.xml за исключением Tomcat? Решение состоит в том, чтобы дать доступ для чтения к server.xml только пользователю root, требуя, чтобы Tomcat был запущен с полномочий пользователя root: если злонамеренный пользователь получает полномочия пользователя root в системе, терение пароля базы данных является, вероятно, незначительным беспокойством.

Иначе необходимо ввести пароль вручную при каждом запуске, но это редко - жизнеспособный вариант.

3
ответ дан Ahmed Ashour 22 June 2016 в 08:25
поделиться

Мы используем C# SHA1CryptoServiceProvider

print(SHA1CryptoServiceProvider sHA1Hasher = new SHA1CryptoServiceProvider();
        ASCIIEncoding enc = new ASCIIEncoding();

        byte[] arrbytHashValue = sHA1Hasher.ComputeHash(enc.GetBytes(clearTextPW));
        string HashData = System.BitConverter.ToString(arrbytHashValue);
        HashData = HashData.Replace("-", "");
        if (HashData == databaseHashedPassWO)
        {
            return true;
        }
        else
        {
            return false;
        });

)

-9
ответ дан Brad8118 22 June 2016 в 08:25
поделиться
  • 1
    Да, это - обязательное условие использовать ReadLine в качестве предложенного Mitch Wheat. – Larry 23 January 2009 в 08:17
Другие вопросы по тегам:

Похожие вопросы: