2010-10-01 12 views
6

Necesito acceder a SecureRandom Java Object desde Javascript. Mi objetivo final es obtener 4 bytes de PRNG y convertirlo a una variable entera de Javascript. De acuerdo con http://download.oracle.com/javase/1.4.2/docs/api/java/security/SecureRandom.html, las siguientes dos líneas de código Java se supone que hacen de agarre 4 bytes aleatorios:Cómo pasar matrices de bytes entre Java y JavaScript

byte bytes[] = new byte[4]; 
random.nextBytes(bytes); 

Mis problemas es que no sé cómo 1) asignar matriz de bytes adecuado para pasar a método Java 2) analizar esa matriz en un entero después

Hasta ahora he logrado getSeed() método que devuelve una matriz de bytes aleatorios. Cuando presento el código HTML proporcionado a continuación en Firefox, muestra "[B @ 16f70a4", que parece ser un puntero o algo así.

<script> 
var sprng = new java.security.SecureRandom(); 
random = sprng.getSeed(4); 
document.write(random + "<br/>\n"); 
</script> 

Esto me hace pensar que tengo éxito para crear una instancia y la clase de acceso de Java, pero tienen un problema con la conversión de tipos.

Puede alguien por favor me ayude a escribir allocateJavaByteArray (N) yconvertJavaByteArrayToInt (N) para dejar el trabajo siguiente código:

var sprng = new java.security.SecureRandom(); 
var nextBytes = allocateJavaByteArray(4); 
srng.nextBytes(nextBytes); 
var nextInt = convertJavaByteArrayToInt(4); 

gracias de antemano.

+0

¿Qué tipo de contexto extraño es usted que puede obtener en el tiempo de ejecución Java desde un '

0

simplemente podría generar un entero aleatorio en el primer lugar, así:

var nextInt = sprng.nextInt(); 
2

Se podría aplicar convertJavaByteArrayToInt así:

function convertJavaByteArrayToInt(bytes) { 
    var r = 0; 
    for (var i = 0; i < bytes.length; i++) { 
    r += (bytes[i] & 0xff) << (8 * i); 
    } 
    return r; 
} 

allocateJavaByteArray es difícil de aplicar, porque no podemos obtener el Clase de byte. Por lo tanto, no es posible usar java.lang.reflect.Array.newInstance para crear una instancia de byte []. Pero aquí es una aplicación difícil:

function allocateJavaByteArray(n) { 
    var r = ""; 
    for (var i = 0; i < n; i++) { 
    r += "0"; 
    } 
    return new java.lang.String(r).getBytes(); 
} 

actualizan: Parece que por encima de código no funcionaba en Firefox 3.6. Aquí hay otro allocateJavaByteArray aplicación, tiene una oportunidad:

function allocateJavaByteArray(n) { 
    var r = new java.io.ByteArrayOutputStream(4); 
    for (var i = 0; i < n; i++) { 
    r.write(0); 
    } 
    return r.toByteArray(); 
} 
+0

Gracias. He intentado con tu código: http://pastebin.com/UW59urTW. Desafortunadamente convertJavaByteArrayToInt() devuelve 0. No sé si se trata de un problema de conversión o quizás la invocación de SPRNG es incorrecta. – abb

+0

cambiar ** convertJavaByteArrayToInt (4) ** a ** convertJavaByteArrayToInt (nextBytes) **, obtendrá lo que desea. – baotuo

+0

La misma diferencia, sigo recibiendo 0. Lo intento en Firefox 3.6.17 en Ubuntu. ¿En qué navegador/plataforma lo tienes funcionando? – abb

0

serie Java es el único que va a pasar en Java> JS o JS-> Java y sin dolor de cabeza.

byte [] o cualquier arry se verá en JS como JSObject.


var sprng = new java.security.SecureRandom(); 

es

var foo= new java.package.SomeClass(); 

funciona en Netscape/Mozilla/FF

Se necesita acceso a clases, por lo que cualquier clase estándar de Java o si necesita cargar un frasco y luego accede a la clase


a la pregunta original:

  1. crear applet de poco con método de utilidad:

    someStringEncodedValue public String() { retorno 1+ "|" 2; }

  2. incluyen subprograma en la página con identificación única

  3. JS encuentran subprograma utilizando id único

  4. método llamado

  5. cadena de análisis (dividida por |)

Cuestiones relacionadas