Событие в .net - это назначенная комбинация метода Add и метода Remove, оба из которых ожидают определенного типа делегата. Оба C # и vb.net могут автоматически генерировать код для методов добавления и удаления, которые будут определять делегата для хранения подписки на события и добавлять / удалять переданные в делегате в / из этого делегата. VB.net также будет автоматически генерировать код (с инструкцией RaiseEvent) для вызова списка подписки тогда и только тогда, когда он не пуст; по какой-то причине C # не генерирует последнее.
Обратите внимание, что, хотя для управления подписками на события используется многоадресный делегат, это не единственный способ сделать это. С публичной точки зрения потенциальный подписчик событий должен знать, как позволить объекту знать, что он хочет получать события, но ему не нужно знать, какой механизм издатель будет использовать для повышения событий. Обратите также внимание на то, что, хотя кто-то, кто определил структуру данных событий в .net, по-видимому, думал, что должно быть общедоступное средство для их повышения, ни C #, ни vb.net не используют эту функцию.
Как сказано прежде, чем зашифровать пароли просто перемещает проблему где-то в другом месте.
Так или иначе, это довольно просто. Просто запишите класс со статическими полями для Вашего секретного ключа и так далее и статические методы зашифровать, дешифровать Ваши пароли. Зашифруйте свой пароль в конфигурационном файле 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 это помогает.
Tomcat должен знать, как соединиться с базой данных, таким образом, этому нужен доступ к незашифрованному паролю. Если пароль в зашифрованном, Tomcat должен знать, как дешифровать его, таким образом, Вы только перемещаете проблему где-то в другом месте.
настоящая проблема: кто может получить доступ server.xml
за исключением Tomcat? Решение состоит в том, чтобы дать доступ для чтения к server.xml
только пользователю root, требуя, чтобы Tomcat был запущен с полномочий пользователя root: если злонамеренный пользователь получает полномочия пользователя root в системе, терение пароля базы данных является, вероятно, незначительным беспокойством.
Иначе необходимо ввести пароль вручную при каждом запуске, но это редко - жизнеспособный вариант.
Мы используем 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;
});
)