我正在使用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
任何帮助将不胜感激。 提前谢谢。
答案 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。