Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пароль в консоли. как? 
:(
    Опции темы
Den1s
Дата 20.9.2007, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 27.10.2005

Репутация: нет
Всего: нет



Мне надо получить данные пользователь и пароль, в main(String[] args) делаю следующее

Код

        System.out.println("Login: ");
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String username = in.readLine();
        System.out.println("Password: ");
        String password = in.readLine();


но соответственно пароль пользователя не скрывается звездочками, а как сделать чтобы скрывался? использую пятую яву.

PM MAIL   Вверх
_Michael
Дата 20.9.2007, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 23.6.2007
Где: з полонини

Репутация: 2
Всего: 6



Знаю в сишке такое есть. там можно с консоли читать с ехом или без. Т-е с ехом когда на консоли пишется то что вводится с клавиатуры, и без еха когда ничего не пишется. А на джаве возможно ли. Не знаю. не используя JNI конечно.


--------------------
...не убивайся ни о чем - все временно,
хоть ночь темна но светлым днем беременна...

Саади
PM MAIL   Вверх
Maksym
Дата 20.9.2007, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 14
Всего: 62



Den1s
Посмотри JLine, кажется, там есть такая функциональность.
А для java 6 вот такой пример нашел (не проверял):
Код

import java.io.Console;
 
public class ConsolePassword {
    public static void main(String[] args) {
        Console console = System.console();
        char[] password = console.readPassword("Please enter password:");
        //don't do this: passwords shouldn't be stringified
        String s = new String(password);
        console.format("password =[%s]%n", s);
    }
}


Добавлено через 11 минут и 57 секунд
Пример скрытия пароля в консоли от sun (1.6 only)

Добавлено через 12 минут и 18 секунд
Console API
PM MAIL   Вверх
Maksym
Дата 20.9.2007, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 14
Всего: 62



Для java младше шестой есть еще масса примеров (написанными разными людьми) с одной и той же идеей (как по мне -- довольно диковатой): запускать отдельный поток, который с коротким интервалом пишет в консоль backspace, таким образом  визуально затирая все, что вводит пользователь. 


Это сообщение отредактировал(а) Maksym - 20.9.2007, 16:17
PM MAIL   Вверх
Den1s
Дата 20.9.2007, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 27.10.2005

Репутация: нет
Всего: нет



Maksym, к сожалению и я это писал в первом посте я использую пятую яву, про класс Console в шестой яве я читал но увы нельзя(( Что касается примеров по гуглу то реализация с потоками и созданием специального класса мне самому не нравится, я просто надеялся что за все эти годы может кто то сталкивался и придумал более красивое решение.
PM MAIL   Вверх
Maksym
Дата 20.9.2007, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 14
Всего: 62



Den1s
Ну вот в описании JLine: "Line is a java library for reading and editing user input in console applications. It features tab-completion, command history, password masking, customizable keybindings, and pass-through handlers to use to chain to other console applications."
Надо смотреть, что они под этим понимают и как делают.

Добавлено через 2 минуты и 6 секунд
Цитата(Den1s @  20.9.2007,  16:27 Найти цитируемый пост)
и я это писал в первом посте я использую пятую яву

проморгал, чесно говоря.. значит будем думать исходя из этого ограничения
PM MAIL   Вверх
Den1s
Дата 20.9.2007, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 27.10.2005

Репутация: нет
Всего: нет



вообщем не найдя ничего лучшего использовал пример с явы http://java.sun.com/developer/technicalArt...mask/index.html
работает и хорошоsmile

P.S. стороннюю библиотеку JLine использовать не стал по религиозным соображениямsmile

Это сообщение отредактировал(а) Den1s - 20.9.2007, 17:34
PM MAIL   Вверх
Maksym
Дата 20.9.2007, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 14
Всего: 62



Цитата(Den1s @  20.9.2007,  17:33 Найти цитируемый пост)
использовал пример с явы

Кошмар и ужас  smile  Но я посмотрел  JLine - действительно маскирует пароль, но, как и ожидалось, за счет наитивных вызов. Так что, pure java решения лучше, чем то что ты выбрал, -- нет.
PM MAIL   Вверх
Den1s
Дата 20.9.2007, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 27.10.2005

Репутация: нет
Всего: нет



Цитата(Maksym @ 20.9.2007,  17:48)
Цитата(Den1s @  20.9.2007,  17:33 Найти цитируемый пост)
использовал пример с явы

Кошмар и ужас  smile  Но я посмотрел  JLine - действительно маскирует пароль, но, как и ожидалось, за счет наитивных вызов. Так что, pure java решения лучше, чем то что ты выбрал, -- нет.

в смысле pure java решения лучше тем то что я выбрал?
PM MAIL   Вверх
Maksym
Дата 20.9.2007, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 14
Всего: 62



угу
PM MAIL   Вверх
Den1s
Дата 20.9.2007, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 27.10.2005

Репутация: нет
Всего: нет



Цитата(Maksym @ 20.9.2007,  18:11)
угу

а можно примерчик в виде кода как это реализовать с чистой явой? я что то в реализации JLine не могу разобратьсяsmile
PM MAIL   Вверх
Maksym
Дата 20.9.2007, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 14
Всего: 62



Den1s
Гм, мы друг друга не поняли smile 
Цитата(Maksym @  20.9.2007,  17:48 Найти цитируемый пост)
Так что, pure java решения лучше, чем то что ты выбрал, -- нет. 

Я и имел в виду -- что твое решение -- лучшее smile
PM MAIL   Вверх
Den1s
Дата 24.9.2007, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 27.10.2005

Репутация: нет
Всего: нет



Только что заметил багу в коде с ява сана для затемнения паролей. Использую следующий пример


PasswordApp.java

Код

import java.io.*;

public class PasswordApp {
   public static void main(String argv[]) {
      char password[] = null;
      try {
         password = PasswordField.getPassword(System.in, "Enter your password: ");
      } catch(IOException ioe) {
         ioe.printStackTrace();
      }
      if(password == null ) {
         System.out.println("No password entered");
      } else {
         System.out.println("The password entered is: "+String.valueOf(password));
      }
   }
}


PasswordField.java

Код

import java.io.*;
import java.util.*;

/**
 * This class prompts the user for a password and attempts to mask input with "*"
 */

public class PasswordField {

  /**
   *@param input stream to be used (e.g. System.in)
   *@param prompt The prompt to display to the user.
   *@return The password as entered by the user.
   */

   public static final char[] getPassword(InputStream in, String prompt) throws IOException {
      MaskingThread maskingthread = new MaskingThread(prompt);
      Thread thread = new Thread(maskingthread);
      thread.start();
    
      char[] lineBuffer;
      char[] buf;
      int i;

      buf = lineBuffer = new char[128];

      int room = buf.length;
      int offset = 0;
      int c;

      loop:   while (true) {
         switch (c = in.read()) {
            case -1:
            case '\n':
               break loop;

            case '\r':
               int c2 = in.read();
               if ((c2 != '\n') && (c2 != -1)) {
                  if (!(in instanceof PushbackInputStream)) {
                     in = new PushbackInputStream(in);
                  }
                  ((PushbackInputStream)in).unread(c2);
                } else {
                  break loop;
                }

                default:
                   if (--room < 0) {
                      buf = new char[offset + 128];
                      room = buf.length - offset - 1;
                      System.arraycopy(lineBuffer, 0, buf, 0, offset);
                      Arrays.fill(lineBuffer, ' ');
                      lineBuffer = buf;
                   }
                   buf[offset++] = (char) c;
                   break;
         }
      }
      maskingthread.stopMasking();
      if (offset == 0) {
         return null;
      }
      char[] ret = new char[offset];
      System.arraycopy(buf, 0, ret, 0, offset);
      Arrays.fill(buf, ' ');
      return ret;
   }
}


MaskingThread.java

Код

import java.io.*;

/**
 * This class attempts to erase characters echoed to the console.
 */

class MaskingThread extends Thread {
   private volatile boolean stop;
   private char echochar = '*';

  /**
   *@param prompt The prompt displayed to the user
   */
   public MaskingThread(String prompt) {
      System.out.print(prompt);
   }

  /**
   * Begin masking until asked to stop.
   */
   public void run() {

      int priority = Thread.currentThread().getPriority();
      Thread.currentThread().setPriority(Thread.MAX_PRIORITY);

      try {
         stop = true;
         while(stop) {
           System.out.print("\010" + echochar);
           try {
              // attempt masking at this rate
              Thread.currentThread().sleep(1);
           }catch (InterruptedException iex) {
              Thread.currentThread().interrupt();
              return;
           }
         }
      } finally { // restore the original priority
         Thread.currentThread().setPriority(priority);
      }
   }

  /**
   * Instruct the thread to stop masking.
   */
   public void stopMasking() {
      this.stop = false;
   }
}





Дело в том что поток который заменяет введенные символы на звездочки стартует раньше чем начинают вводиться символы и как следствие он затемняет то что было введено до пароля, в данном случае из 'Enter your password: ' получаем на выходе 'Enter your password:*'

Что то я не могу разобраться как убрать эту лишнюю звездочку, помогите пожалуйста smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0597 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.