2011-08-28 32 views
5

Tôi đang tạo biểu mẫu đăng ký cơ bản bằng ruby ​​trên đường ray (tôi tương đối mới đối với đường ray) và những gì tôi muốn biết là làm cách nào để mã hóa mật khẩu của người dùng mới (vì lý do bảo mật rõ ràng)?Tôi làm cách nào để thêm mã hóa cơ bản vào mật khẩu?

Dưới đây là trang web của tôi đăng ký:

<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 %> 

Và bộ điều khiển tài khoản:

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 

Bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn trước.

Trả lời

11

Ở đây bạn đi:

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

Và cho xác thực:

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

Nhưng giống như allesklar viết, Rails 3.1 sẽ là một lựa chọn tốt. Xem Railscasts về chủ đề này.

2

Bạn không thực sự mã hóa mật khẩu của người dùng, bạn băm nó.

Sử dụng hàm băm SHA2, như SHA-256 hoặc SHA-512. Kết hợp muối và kéo dài để tăng cường bảo mật chống lại các cuộc tấn công ngoại tuyến. Tôi không thể làm Ruby, nhưng đây là một số giả mã.

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 

Lưu trữ băm cuối cùng và muối liên quan trong cơ sở dữ liệu của bạn cho người dùng đó. Lần tới, người dùng ghi lại quá trình lặp lại, sử dụng cùng một loại muối và so sánh các băm cuối cùng. Nếu chúng khớp với người dùng đã nhập đúng mật khẩu.

Việc sử dụng muối được sử dụng để đảm bảo rằng nếu hai người dùng xảy ra để chọn cùng một mật khẩu thì băm của họ khác nhau. 64 đến 128 bit (8 đến 16 byte) muối là hợp lý. Kéo dài (5000 lần lặp lại) là làm chậm kẻ tấn công. Chọn số lần lặp lại để mất khoảng 0,1 giây để băm mật khẩu. Một phần mười của một sự chậm trễ thứ hai sẽ không được nhận thấy bởi một người dùng đăng nhập vào, nhưng nó sẽ giới hạn bất kỳ kẻ tấn công để cố gắng nhiều nhất là mười đoán mỗi giây.

2

Nếu bạn là người mới, nhưng không chỉ, bạn có thể thấy việc nâng cấp lên Rails 3.1 dễ dàng hơn nhiều và sử dụng cuộc gọi "has_secure_password" trong mô hình của mình. Có một số good post here.

Tất cả công việc được thực hiện cho bạn bởi Rails.

Chỉnh sửa: Url liên kết đã thay đổi theo đề xuất của Brian May. Cảm ơn Brian.

+1

liên kết này không hoạt động ngay bây giờ. Đây là tài liệu của 'has_secure_password': http://api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html – Brian

+0

Cảm ơn Brian. Tôi đã cập nhật liên kết. – allesklar

Các vấn đề liên quan