控制台应用程序中的Java KeyListener

时间:2011-07-29 14:56:57

标签: java console cryptography keylistener

我目前正在寻找用于生成安全AES密钥的用户输入定向方法。该应用程序是一个控制台应用程序,它通过复制随机生成的文本字符串来获取用户输入,其中考虑按键之间的间隔时间以生成随机AES密钥。我有什么方法可以这样做吗?

4 个答案:

答案 0 :(得分:1)

似乎没有可移植的方式。您需要读取一个默认情况下未启用的单个字符,甚至不需要使用Console类。通常,Java只读取整行。 Here's the question of how to get around that.摘要:将您的控制台敲入原始模式。

假设您使用的是unix系统,这可行(在OSX上测试):

import java.io.Console;
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;


public class Main {

    public static void main(String[] args) throws IOException, InterruptedException {
        String[] cmd = {"/bin/sh", "-c", "stty raw </dev/tty"};
        Runtime.getRuntime().exec(cmd).waitFor();
        Console console = System.console();
        Reader reader = console.reader();
        ArrayList<Long> timeStamps = new ArrayList<Long>();
        StringBuilder password = new StringBuilder();
        timeStamps.add(System.currentTimeMillis());
        System.out.println("Enter your 8 character password");
        for(int i = 0;i<8;i++) {
            password.append(reader.read());
            timeStamps.add(System.currentTimeMillis());
        }
        System.out.println("Timestamps: ");
        System.out.println(timeStamps);
        cmd = new String[] {"/bin/sh", "-c", "stty sane </dev/tty"};
        Runtime.getRuntime().exec(cmd).waitFor();           
    }
}

答案 1 :(得分:1)

对您的问题不是一个真正的答案,但是有任何理由说明KeyGenerator不适合您的目的吗?

KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256, SecureRandom.getInstance("SHA1PRNG"));

答案 2 :(得分:0)

非常愚蠢的回答可能,但是“任意键”可以被回车键替换吗?在这种情况下,您可以使用读取线的精确定时和抖动,而不是单独的字符。您可以使用System.nanoTime()来 - 可能 - 添加一些熵。请注意,虽然通常这样的方案会给你一些熵,但JVM,操作系统和机器依赖于在现场不使用它。

答案 3 :(得分:0)

JLine可能有所帮助。该库具有一些本机代码,但可以在不同的平台上运行,并且可以从控制台读取单个字符。