2011-08-28 21 views
5

Estoy creando un formulario básico de registro usando ruby ​​on rails (soy relativamente nuevo en los rieles), y lo que quiero saber es cómo puedo cifrar la contraseña del nuevo usuario (por razones obvias de seguridad).¿Cómo puedo agregar cifrado básico a la contraseña?

Aquí está mi página de registro:

<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
    $.noConflict(); 
    jQuery(document).ready(function($) { 
    $('a.close').click(function(){ 
     $(this).parent().fadeOut(); 
    }); 
    }); 
</script> 
<% if !flash.now[:notice].blank? %> 
<div class="alert-message error"> 
    <a class="close" href="#">×</a> 
    <p><strong><%= flash.now[:notice][0] %></strong></p> 
</div> 
<% end %> 
<div class="alert-message info"> 
    <p><strong>Join us. It's as simple as 1 2 3.</strong></p> 
</div> 
<% form_for :user do |f| %> 
    <p> Email: <br /> <%= f.text_field :email %></p> 
    <p> Name: <br /> <%= f.text_field :name %></p> 
    <p> Username:<br /><%= f.text_field :username %></p> 
    <p> Password: <br /> <%= f.password_field :password %></p> 
    <p> Blog <i>(optional)</i>: <br /> <%= f.text_field :blog %></p> 
    <p><%= submit_tag "Create User", :disable_with => "Please wait...", :class => "btn primary" %></p> 
<% end %> 

y el controlador del usuario:

class UsersController < ApplicationController 
    def register 
    @user = User.new(params[:user]) 
    if(request.post? and @user.save) 
     flash[:notice] = "Account Created Successfully" 
     redirect_to root_path  
    else 
     flash.now[:notice] = @user.errors.full_messages 
    end 
    end 
    def destroy 
    @user = User.find(params[:id]) 
    @user.destroy 
    redirect_to root_path 
    end 
end 

se agradecería cualquier ayuda. Gracias de antemano.

Respuesta

11

Aquí van:

self.salt = ActiveSupport::SecureRandom.base64(8) 
self.hashed_password = Digest::SHA2.hexdigest(self.salt + submitted_password) 

Y el para la autentificación:

def password_correct? 
    user.hashed_password == Digest::SHA2.hexdigest(user.salt + password_to_confirm) 
end 

Pero como escribió allesklar, rieles 3.1 será una buena opción. Mira el Railscasts sobre el tema.

2

En realidad no encriptas la contraseña de un usuario, la hascas.

Utilice un hash SHA2, como SHA-256 o SHA-512. Incorpora sal y estiramiento para mayor seguridad contra los ataques fuera de línea. No puedo hacer Ruby, pero aquí hay un pseudocódigo.

salt <- generateRandomSalt(); 

method hashPassword(password) 
    hash <- password 
    reps <- 5000 // Tune this number to your system 
    for (reps times) 
    hash <- hash + salt // Concatenate 
    hash <- SHA256(hash) 
    end for 
    return hash 
end hashPassword 

Almacene el hash final y la sal asociada en su base de datos para ese usuario. La próxima vez que el usuario inicie sesión, repita el proceso, use la misma sal y compare los valores hash finales. Si coinciden, el usuario ingresó la contraseña correcta.

La salazón se utiliza para asegurarse de que si dos usuarios eligen la misma contraseña, los valores hash son diferentes. 64 a 128 bits (8 a 16 bytes) de sal es razonable. Estirar (las 5000 repeticiones) es ralentizar a un atacante. Elija el número de repeticiones, por lo que se tarda unos 0,1 segundos en obtener una contraseña. El usuario que inicia sesión no detectará una décima de segundo de retraso, pero limitará a cualquier atacante a intentar al menos diez conjeturas por segundo.

2

Si es nuevo, pero no solo, le resultará mucho más fácil actualizar a Rails 3.1 y utilizar la llamada "has_secure_password" en su modelo. Hay un good post here.

Todo el trabajo lo hace Rails.

Editar: Se modificó la URL del enlace de acuerdo con la sugerencia de Brian May. Gracias Brian.

+1

el enlace no funciona ahora. Aquí está el documento de 'has_secure_password': http://api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html – Brian

+0

Gracias Brian. He actualizado el enlace. – allesklar

Cuestiones relacionadas