Avatar billede daniboy Nybegynder
16. januar 2004 - 20:12 Der er 9 kommentarer og
1 løsning

Password sløring i Command prompt

Jeg har et program hvor jeg gerne vil undgå for meget avanceret GUI og derfor har valgt at opererer i DOS miljø...

Jeg har et sted hvor jeg gerne skal have sløret et password man skal indtaste da andre omkring stående ikke gerne skulle kunne læse det...
eks.
Brugernavn: Gnuer
Password:  *********

som man kender det fra alle mulige steder hvor man skal indtaste brugernavn os passwords....
Kan det lade sig gøre med java i en command prompt??? =)
Avatar billede arne_v Ekspert
16. januar 2004 - 20:33 #1
Det kan du mig bekendt ikke.

Se f.eks.
  http://www.jguru.com/faq/view.jsp?EID=23448
Avatar billede _carsten Nybegynder
16. januar 2004 - 22:22 #2
Fik lige tid til at lave en meget simpel GUI til at indtaste password - ved ikke om du kan bruge den ?

import javax.swing.*;

public class Password extends JFrame{
    private JPasswordField field;
    char[] pWord;
   
    public Password() {
        System.out.println(getPassword());
    }
   
    private String getPassword(){
        final String s;
       
        JDialog pass = new JDialog(JOptionPane.getFrameForComponent(this),
                                                    "Skriv dit password",
                                                    true);
       
        pass.getContentPane().setLayout(new java.awt.FlowLayout());
       
        field = new JPasswordField(10);
       
        OkListener oklisten = new OkListener();
        CancelListener cancellisten = new CancelListener();
        JButton ok = new JButton("OK");
        ok.addActionListener(oklisten);
       

        JButton cancel = new JButton("Cancel");
        cancel.addActionListener(cancellisten);
        JLabel label = new JLabel("Skriv password");
       
     
        pass.getContentPane().add(label);
        pass.getContentPane().add(field);
        pass.getContentPane().add(ok);
        pass.getContentPane().add(cancel);
       
        pass.pack();
        pass.show();
       
        if(pWord == null)
            return "";
        else
            return new String(pWord);
    }
   
        class OkListener implements java.awt.event.ActionListener{
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                pWord = field.getPassword();
                setVisible(false);
                dispose();
            }
        }

        class CancelListener implements java.awt.event.ActionListener{
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                setVisible(false);
                dispose();
            }
        }
       
    public static void main(String[] args) {
        new Password();
    }
}
Avatar billede daniboy Nybegynder
17. januar 2004 - 00:22 #3
Arbejder ikke med at lave GUI ellers tak :)

Arne Hmm nej ikke direkte... der var dog posted noget kode til en work around...

"In short, you have to start additional thread and setup that thread to print sequences of random character and then double backspace for about 100 times in a second (better to both System.out and System.err). So. That thread will make enough noice to made entered password completely unreadable. Of course thread should be stopped after user will press Enter."

Og det tager jeg som et svar... =)
Avatar billede arne_v Ekspert
17. januar 2004 - 11:13 #4
Det er ikke en løsning jeg synes er god.

Men hvis den passer til dig så fint.
Avatar billede arne_v Ekspert
17. januar 2004 - 11:14 #5
Vil du have et svar ?
Avatar billede daniboy Nybegynder
18. januar 2004 - 03:10 #6
Ja løsningen er ikke særlig god... men det ser jo ikke ud til at der findes andre metoder til det

Men da det ligner det eneste brugbare mulighed og du har fundet den ville et svar værre passende...
Avatar billede Kim Rosgaard Praktikant
18. januar 2004 - 03:20 #7
jeg fandt denne løsning hvis du har installeret Active Perl:


use Term::ReadKey;

# optional: END { ReadMode ('restore'); }      # just in case

$| = 1; # unbuffer stdout

my $pwd = '';

# two ways - first doesn't echo anything, second echoes * for each char and
# allows correction

if (0) {

        print "Password: ";
        ReadMode ('noecho');
        $pwd = ReadLine ();
        chomp $pwd;
        ReadMode ('restore');

} else {

        binmode STDIN;
        print "Password: ";
        ReadMode ('cbreak');
        while (defined (my $ch = ReadKey ())) {

                last if $ch eq "\x0a" or $ch eq "\x0d";
                if ($ch eq "\x08") {    # backspace
                        print "\b \b" if $pwd;          # back up 1
                        chop $pwd;
                        next;
                }
                if ($ch eq "\x15") {    # ^U
                        print "\b \b" x length $pwd;    # back 1 for each char
                        $pwd = '';
                        next;
                }
                $pwd .= $ch;
                print '*';
        }
        ReadMode ('restore');
}


print "\n";
print "Password entered was $pwd\n";

__END__



use Win32::Console;

$| = 1; # unbuffer stdout

my $debug = 1;
my $key = '';
my $passwd = '';
my $prompt = "Type password followed by ENTER: ";
my $prompt2 = "try again: ";

my $IN = new Win32::Console (STD_INPUT_HANDLE) or die $!;
print $prompt;
$IN->Flush ();                  # optionally flush input
while (1) {

        my @e = $IN->Input();
        print "Event='@e'\n" if $debug;

        next if ($e[0] != 1 or $e[1] != 0);    # not keybd key up

        my $key = chr ($e[5]);
        print "key=$key '$e[5]'\n" if $debug;

        if ($key =~ /[\r\n]/) {        # EOL
                if (length $passwd > 0) {
                        print "\n";
                        last;
                }
        } elsif ($e[5] == 8 and ($e[6] == 8 or $e[6] == 0)) {  # BS or DEL
                $passwd =~ s/^(.*).$/$1/;
                print "\b \b";
                print "1 passwd=$passwd ", length $passwd, "\n" if $debug;
        } elsif ($e[6] == 8 and $e[5] == 21) {  # ^U
                $passwd = '';
                print "2 passwd=$passwd ", length $passwd, "\n" if $debug;
        } elsif ($e[6] == 8 and ($e[5] == 4 or $e[5] == 26)) {  # ^D or ^Z
                last;
        } elsif ($e[6] == 0 or $e[6] == 16) {  # regular key
                next if $e[5] == 0;
                $passwd .= $key;
                print "3 passwd=$passwd ", length $passwd, " " if $debug;
                print "*";
                print "\n" if $debug;
        } else {
                print "? passwd=$passwd ", length $passwd, "\n" if $debug;
                print "Illegal key\n";
        }
}

print "passwd=$passwd\n" if $debug;

$IN->Flush ();
#$IN->Free ();  # don't free or you lose STDOUT
#undef $IN;

__END__


fundet her:
http://www.mail-archive.com/activeperl@listserv.activestate.com/msg13789.html
Avatar billede arne_v Ekspert
18. januar 2004 - 09:58 #8
svar
Avatar billede arne_v Ekspert
18. januar 2004 - 09:59 #9
ghostcom>

Vi er i Java kategorien.
Avatar billede Kim Rosgaard Praktikant
18. januar 2004 - 14:51 #10
ah sorry..havde jeg ikke lige set..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester