2008-11-30 12 views
5

Estoy queriendo generar un valor de sal al azar y ponerlo en el estado de la Aplicación.¿Cuál es la mejor forma de generar una sal aleatoria para un sitio web?

Ahora, estoy usando una granja de servidores web, por lo que el estado de la aplicación será diferente por máquina. Tampoco quiero comprar aplicaciones de granja de estado distribuidas.

Entonces ... ¿cuáles son algunas soluciones para esto? Pensé que podría codificarlo en el código O en el archivo web.config ... pero eso significa la misma sal para eva ... no muy seguro.

¿Alguien tiene alguna sugerencia?

Recuerde: estoy buscando una clave única (por ejemplo, un guid) que sea la misma en todas las máquinas. Tal vez un archivo de configuración es la única manera?

+0

¿Puede explicarnos cuál sería el objetivo de esto? A menos que todos y cada uno de los miembros de la granja hagan la misma secuencia de generaciones de números aleatorios, se saldrán de la "sincronización", entonces, ¿cuál es el punto? – cletus

+0

esa es EXACTAMENTE mi pregunta. El servidor 'A' crea una sal aleatoria, lo que hace que algo se mezcle. El resultado va al cliente El cliente responde a la granja (pasando el ha), pero golpea el servidor 'B'. El servidor 'B' necesita generar el mismo hash (usando la misma sal) para compararlo con los datos hash del cliente. –

Respuesta

4

Si entiendo correctamente, quiere que las máquinas compartan un valor, y no desea que el valor sea el mismo para siempre. Idealmente, preferiría no almacenarlo.

Por lo tanto, haga que la "primera" máquina genere un valor aleatorio al inicio, (usando la entropía que pueda, como/dev/random. Si no necesita un valor seguro, y no tiene suficiente entropía en inicio para crear uno de todos modos, use el tiempo o lo que sea) y comuníquelo a todos los demás. A medida que las máquinas nuevas se unen al clúster, es necesario que puedan encontrar el valor de una máquina que ya está en el clúster. Las máquinas que abandonan no hacen diferencia.

¿Qué máquina es la "primera"? Bueno, si siempre puede arrancar una máquina antes que otras, y darle tiempo para llegar al punto de generar un valor, entonces puede usar el algoritmo trivial:

1) Busque otras máquinas. Si encuentra uno, pregúntele el valor. 2) Si no encuentra uno, genere el valor usted mismo.

Si varias máquinas se están iniciando a la vez, deben decidir entre ellas cuál es el "líder". Puede hacer esto eligiendo uno usted mismo (por ejemplo, una máquina se declara "líder" tan pronto como recibe una conexión particular a través de la interfaz de administración: al inicio cada máquina espera hasta que recibe esta conexión, o escucha desde otra máquina que la otra la máquina es el líder). Es trivial hacerlo automáticamente en un anillo de token: la máquina con la menor dirección MAC o lo que sea líder. Pero nadie usa token ring más ...

En el extremo opuesto de una red no confiable, no estoy seguro de que sea posible, a menos que todas las máquinas sepan cuántas habrá en total (en cuyo caso es como el token ring, excepto que todos hablan entre ellos hasta que hayan descubierto quién es el líder). Con la transmisión confiable, que es lo que puede asumir dentro de límites razonables en Ethernet, estoy seguro de que hay un algoritmo óptimo publicado en alguna parte, pero olvido lo que es (si es que alguna vez lo supe). Supongo que todo el mundo difunde a quién creen que es el líder a intervalos regulares (incluido su propio reclamo si aún no han visto uno mejor). Una vez que hayas escuchado eso durante el tiempo suficiente (aproximadamente un intervalo), sabrás quién es el líder y podrás comenzar a usar la semilla.

Si el valor es un secreto, obviamente la comunicación dentro del clúster debe ser segura. Es posible que lo obtenga de forma gratuita, dependiendo de la arquitectura de la red.

+1

er ... eso es faaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa un valor de sal al azar que no es TAN importante. es correcto, con respecto a su párrafo de apertura también. –

+1

Bueno, no sé cuán importantes son sus números aleatorios. La aleatoriedad varía de "bien podría ser siempre usar 23" a "amenazar a la empresa", así que me equivoco por el exceso de ingeniería ;-) –

2

En un escenario de granja web, el machine key almacenado en machine.config puede ser lo que está buscando. Es un hash generado aleatoriamente que debe ser el mismo en todas las máquinas de la granja de servidores web.

+0

pensé en eso, pero ese sigue siendo un valor en el web.config. Así que estaba revisando para ver si esa es una buena forma de hacer esto. –

0

Aquí es un divertido/interesante manera:

Al comienzo de cada día, es decir, después de las 00:00, gorjeo de búsqueda o digg o FriendFeed o cualquier cosa que con frecuencia ha de cambiar los datos de un detalle justo antes de/a las 00 : 00. Todas las máquinas obtendrían esta misma información Y está garantizado que cambiará. Para hacerlo secreto, combine este detalle con alguna clave secreta o el MAC del servidor DNS o algo similar.

Creo que esto es lo suficientemente simple y divertido. Por supuesto, esto significaría que su sitio web dependería de este sitio web externo por algo trivial y que podría ser difícil si el sitio no funciona. Pero en tales casos puede retener y continuar con los datos del día anterior.

Solo quería escribir sobre esto como una forma divertida/interesante :)

+0

:) lolz. lindo, pero no puedo depender de otro punto final externo. –

Cuestiones relacionadas