如何为密码添加基本加密?

时间:2011-08-28 08:32:17

标签: ruby-on-rails ruby-on-rails-3 encryption

我正在使用ruby on rails创建一个基本的注册表单(我对rails来说比较新),我想知道的是如何加密新用户的密码(出于明显的安全原因)?

这是我的注册页面:

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

用户控制器:

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

任何帮助将不胜感激。 提前谢谢。

3 个答案:

答案 0 :(得分:11)

你走了:

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

用于身份验证:

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

但是像allesklar所写,Rails 3.1将是一个不错的选择。观看主题的Railscasts

答案 1 :(得分:2)

您实际上并没有加密用户的密码,而是将其哈希。

使用SHA2哈希,如SHA-256或SHA-512。合并盐和拉伸以增强安全性以防止脱机攻击。我不能做Ruby,但这里有一些伪代码。

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

将最终哈希值和关联的salt存储在数据库中以供该用户使用。下次用户登录时,使用相同的盐重复该过程,并比较最终的哈希值。如果匹配,则用户输入正确的密码。

Salting用于确保如果两个用户碰巧选择相同的密码,那么他们的哈希值会有所不同。盐的64到128位(8到16个字节)是合理的。拉伸(5000次重复)是为了减缓攻击者的速度。选择重复次数,因此哈希密码大约需要0.1秒。用户登录时不会注意到十分之一秒的延迟,但它会限制任何攻击者每秒最多尝试十次。

答案 2 :(得分:2)

如果您是新手,但不仅如此,您可能会发现升级到Rails 3.1并在模型中使用“has_secure_password”调用会更容易。有good post here

Rails为您完成了所有工作。

编辑:根据Brian May的建议更改了链接网址。谢谢Brian。