Soru Konsoldan şifre girişi maskeleme: Java


Konsol girişinden şifre nasıl gizlenir? Java 6 kullanıyorum.

Kullanarak denedim console.readPassword()ama işe yaramazdı. Tam bir örnek aslında bana yardımcı olabilir.

İşte kodum:

import java.io.BufferedReader;
import java.io.Console;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test 
{   
    public static void main(String[] args) 
    {   
        Console console = System.console();

        console.printf("Please enter your username: ");
        String username = console.readLine();
        console.printf(username + "\n");

        console.printf("Please enter your password: ");
        char[] passwordChars = console.readPassword();
        String passwordString = new String(passwordChars);

        console.printf(passwordString + "\n");
    }
}

NullPointerException alıyorum ...


32
2017-11-15 15:04


Menşei


Tam olarak nasıl değil console.readPassword() iş? - BalusC
bir IDE içinden değil konsoldan çalıştır - bilash.saha
Bu kod bir ide'de çalışmıyor, lütfen güncellenmiş cevabımı görün. - Woot4Moo
projeyi bir jar dosyası olarak vermek ve komut satırından çalıştırmak zorundayım? öyleyse, bunu yaptım ve bu hatayı aldım .. "C: \ ...... 'dan Ana Sınıf manifest niteliği yüklenemedi." - New Start
Şuna baksana stackoverflow.com/questions/2591516/... - bilash.saha


Cevaplar:


Tam bir örnek? Bu kodu çalıştırın: (NB: Bu örnek, System.console () yönteminin bu durumda null olabileceğinden, konsoldaki bir IDE içinden değil, en iyi şekilde çalıştırılır.)

import java.io.Console;
public class Main {

    public void passwordExample() {        
        Console console = System.console();
        if (console == null) {
            System.out.println("Couldn't get Console instance");
            System.exit(0);
        }

        console.printf("Testing password%n");
        char passwordArray[] = console.readPassword("Enter your secret password: ");
        console.printf("Password entered was: %s%n", new String(passwordArray));

    }

    public static void main(String[] args) {
        new Main().passwordExample();
    }
}

47
2017-11-15 15:14



Boş bir işaretçi alıyorum ... bu işe yaramıyor - PTBG
Bunu bir IDE içinden mi çalıştırıyorsunuz? Kod çalışmıyor mu? Neden reddediliyor? - bilash.saha
Boş göstericiyi alan kişiler için, konsoldan çalıştır, tutulmadan - Sinisha Mihajlovski
@ Woot4Moo Bunun neden "son derece güvensiz" olduğunu açıklayabilir misiniz? Neden herhangi bir bağlamı olmasa da, tek başına beyan, anlayışı geliştirmek için çok yararlı değildir (doğrulanması veya reddedilmesi de kolay değildir). - M. Justin
Şifreyi tam anlamıyla konsola yazdırmak için bir satırın dahili bellek güvenliği riskini aşmak gibi bir şey yoktur. - Patrick Parker


Sen kullanırsın Konsol sınıf

char[] password = console.readPassword("Enter password");  
Arrays.fill(password, ' ');

ReadPassword echoing yürütülürken devre dışı bırakılır. Ayrıca parola doğrulandıktan sonra dizideki değerlerin üzerine yazmak en iyisidir.

Bunu bir ide'den çalıştırırsanız başarısız olur, lütfen tam bir cevap için bu açıklamaya bakın: Açıklaması


7
2017-11-15 15:08



Java 1.6'dan beri destekleniyor - AlexR
@AlexR, OP'den doğru: "Java 6 kullanıyorum." - Woot4Moo
@ Woot4Moo: "Kabul edilen yanıtın nasıl güvensiz olduğunu" açıklayabilir misiniz? Okuduktan sonra şifreyi yazdığını görüyorum, ama bu aptalca görünüyor. Ne yaparsanız yapın, şifre bir süre için hafızada olacak. Parolayı tutan belleği el ile yazmamış olsanız bile, toplanan çöpleri alır ve bellek başka bir şeyle yeniden doldurulur. Dürüst olmak gerekirse, birisi anılarda rastgele adresleri okuma becerisine sahipse, daha büyük endişelerinizin olması gerektiğini düşünüyorum. - ArtOfWarfare
@ArtOfWarfare, "yanıt" ın şimdiye kadar değiştiği durumda: stackoverflow.com/a/8138549/205426     Belirtmiş olduğum gibi güvensiz olmasının sebebi şudur: yeni String (passwordArray) yeni bir String, bir JVM'nin ömrü boyunca "asla" ortadan kalkmayan String Pool'a tahsis edilir. Çöp toplama hakkındaki ifadenize karşı koymak için, String sınıfının "özel" olduğunu ve GCd'yi alamadığını bilmiyor olabilirsiniz. Ve evet, şifrenin bir süreliğine hafızada kalacağına katılıyorum, sadece mümkün olan en fazla zamanı azaltabiliyorum. - Woot4Moo
@ArtOfWarfare ek olarak, JVM kadar karmaşık bir sistemle ilgili sorunları olacak. Bu yazıyı JVM'ye karşı yaptığımdan beri neredeyse 4 yıl içinde keşfedilmiş çok sayıda güvenlik açığı oldu. Yani JVM'yi 2011'den beri Java 6'da çalıştırıyor olsaydım, bir "keyfi bellek" istismarının olduğuna inanıyorum. - Woot4Moo


Console console = System.console();
String username = console.readLine("Username: ");
char[] password = console.readPassword("Password: ");

2
2017-11-21 15:50



Şifre dizisini doldurmak gerekiyor. - Woot4Moo


Bir Java karakter dizisiyle (konsoldan okuduğunuz parola karakterleri gibi) ilgileniyorsanız, aşağıdaki Ruby kodunu içeren bir JRuby dizesine dönüştürebilirsiniz:

# GIST: "pw_from_console.rb" under "https://gist.github.com/drhuffman12"

jconsole = Java::java.lang.System.console()
password = jconsole.readPassword()
ruby_string = ''
password.to_a.each {|c| ruby_string << c.chr}

# .. do something with 'password' variable ..    
puts "password_chars: #{password_chars.inspect}"
puts "password_string: #{password_string}"

Ayrıca bakınız "https://stackoverflow.com/a/27628738/4390019" ve "https://stackoverflow.com/a/27628756/4390019"


0
2017-12-23 22:08