我正在编写一个需要从系统的 /dev/urandom 接口中提取 32 个字符的密钥的 Java 程序。为此,我使用以下过程:
public String generateKey() {
try {
Runtime run = Runtime.getRuntime();
Process pr = run.exec("tr -cd '[:alnum:]' < /dev/urandom | fold -w30 | head -n1;echo;");
pr.waitFor();
BufferedReader buf = new BufferedReader(new InputStreamReader(pr.getInputStream()));
StringBuffer sb = new StringBuffer();
String line = "";
while ((line = buf.readLine())!= null ) {
sb.append(line);
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
return "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
}
}
(如果它不能这样做,那么它将返回一堆空字符)
由于某种原因,它什么都不返回(或抛出异常而不打印堆栈跟踪)。我知道这一点,因为我将它打印到控制台(什么都没有),当我将它提供给我的 RC4 引擎时,它会引发除以零错误。为什么命令不起作用,我怎样才能使它起作用?
感谢您的帮助。
编辑:在我发布此消息后不到两分钟,我推断它没有返回空字符,因为我将它设置为返回单词“柠檬”并且它做了同样的事情,所以它不会抛出异常。
编辑2:根据评论中的建议,我尝试从文件中直接读取结果相同,但我认为我可能做错了......
File file = new File("/dev/urandom");
FileReader freader = null;
StringBuffer sb = new StringBuffer();
int x = 0;
try {
freader = new FileReader(file);
BufferedReader reader = new BufferedReader(freader);
for (int i=0;(i<32||(x=reader.read())==-1);i++) {
sb.append((char) x);
}
return sb.toString();
} catch(Exception e) {
e.printStackTrace();
return "a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
}
编辑 3:这可能对那些帮助的人有所帮助:使用上面的代码并将输出传送到 od 我发现它只是读取 0。(同样,它不会抛出异常,否则它不会全为零:)
# ./run.sh | od
0000000 000000 000000 000000 000000 000000 000000 000000 000000
*