我目前正在寻找用于生成安全AES密钥的用户输入定向方法。该应用程序是一个控制台应用程序,它通过复制随机生成的文本字符串来获取用户输入,其中考虑按键之间的间隔时间以生成随机AES密钥。我有什么方法可以这样做吗?
答案 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可能有所帮助。该库具有一些本机代码,但可以在不同的平台上运行,并且可以从控制台读取单个字符。