システムの /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";
}
}
(それができない場合は、一連の null 文字が返されます)
何らかの理由で、何も返されません (または、例外がスローされ、スタック トレースが出力されません)。私はこれをコンソールに出力し (何も表示しない)、RC4 エンジンに渡すとゼロ除算エラーがスローされるため、これを知っています。コマンドが機能しないのはなぜですか?どうすれば機能させることができますか?
お手伝いありがとう。
編集:これを投稿してから2分も経たないうちに、「レモン」という単語を返すように設定し、同じことを行ったため、null文字が返されていないと推測しました。例外はスローされません。
編集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
*