В клиент-серверном приложении:Как отправить в БД пароль приложения пользователя?
Вопрос
У меня есть настольное приложение Java, которое напрямую подключается к БД (Ораклу).Приложение имеет несколько учетных записей пользователей.Каков правильный метод отправки пароля пользователя (а не пароля БД) по сети?Я не хочу отправлять это в виде обычного текста
Решение
Вы можете подключиться через защищенное сокетное соединение или локально хэшировать пароль перед отправкой его в базу данных (или, лучше, и то, и другое). В идеале, единственный раз, когда пароль должен существовать в текстовой форме, - это до хеширования.Если вы можете сделать все это на стороне клиента, чем больше, тем лучше.
Другие советы
Вы можете использовать SSL-соединение между клиентом Oracle и базой данных Oracle.Чтобы настроить SSL между клиентом и сервером Oracle с помощью JDBC:
На стороне сервера:
1) Прежде всего, слушатель должен быть настроен на использование протокола TCPS:
LISTENER = (ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcps)(HOST=servername)(PORT=2484)))
WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/server/wallet/path/)))
На стороне клиента:
1) следующие банки должны быть путем к классамojdb14.jar
, oraclepki.jar
, ojpse.jar
2) URL-адрес, используемый для подключения, должен быть:
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=servername)(PORT=2484))(CONNECT_DATA=(SERVICE_NAME=servicename)))
3) Необходимо установить следующие свойства (либо как системное свойство (параметры -D), либо как свойства для подключения):
javax.net.ssl.trustStore,
javax.net.ssl.trustStoreType,
javax.net.ssl.trustStorePassword
Ссылка: http://www.oracle.com/technology/tech/java/sqlj_jdbc/pdf/wp-oracle-jdbc_thin_ssl_2007.pdf
Согласен, никогда не отправляйте выбранный пользователем пароль в открытом виде.Однако, за исключением использования криптографии с открытым ключом, если вы отправите им пароль по электронной почте, он будет в открытом виде.Я часто наблюдал одну вещь: когда пользователь забывает пароль и запрашивает его отправку, система генерирует новый пароль и отправляет что один для пользователя.После этого пользователь может изменить пароль.
Таким образом, выбранный пользователем пароль (который пользователь может использовать где-то еще) никогда не отправляется, а его временный пароль отправляется в виде открытого текста, и вскоре после этого им следует изменить его.
Если вы не хотите отправлять данные в виде обычного текста, используйте шифрование!!!
Используйте какой-либо алгоритм шифрования, например AES, Twofish и т. д.
Вы также должны принять во внимание, где находятся ваш клиент и сервер.Если они оба находятся на одной машине, шифрование бесполезно.Если они находятся на разных машинах, используйте какой-либо алгоритм шифрования для отправки конфиденциальных данных.
Если ВЫ проверяете достоверность паролей, вы можете просто отправить хэш пароля.Имейте в виду, что этот метод сработает только в том случае, если вы сами сравниваете пароль.Если какое-либо другое приложение (вне вашего контроля) выполняет задание проверки, вы не сможете хешировать пароль.
Если вы подключаетесь напрямую к БД без промежуточного уровня, вам следует рассмотреть возможность использования пользователя БД для каждого реального пользователя, поскольку в противном случае вы не сможете по-настоящему защитить доступ приложения.
Если вы подключаетесь к Oracle с помощью ORa*Net, пароль пользователя автоматически шифруется (начиная с Oracle 8), однако в некоторых ситуациях он может вернуться к незашифрованным паролям.Это можно отключить с помощью ORA_ENCRYPT_LOGIN=true
в среде клиента.