Как я могу добавить базовое шифрование к паролю? - PullRequest
5 голосов
/ 28 августа 2011

Я создаю базовую форму регистрации, используя 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 ]

11 голосов
/ 28 августа 2011

Вот, пожалуйста:

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 на эту тему.

2 голосов
/ 28 августа 2011

Если вы новичок, но не только, вам может быть гораздо проще перейти на Rails 3.1 и использовать вызов has_secure_password в вашей модели.Здесь есть хороший пост .

Вся работа сделана для вас Rails.

Редактировать: URL ссылки изменен согласно предложению Брайана МэйСпасибо, Брайан.

2 голосов
/ 28 августа 2011

Вы на самом деле не шифруете пароль пользователя, вы его хешируете.

Используйте хеш 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

Сохраните окончательный хеш и соответствующую соль в вашей базе данных для этого пользователя.В следующий раз, когда пользователь войдет в систему, повторите процесс, используя ту же соль, и сравните окончательные хеши.Если они совпадают, пользователь ввел правильный пароль.

Соль используется, чтобы убедиться, что если два пользователя выберут один и тот же пароль, то их хэши будут разными.Разумно использовать от 64 до 128 бит (от 8 до 16 байт) соли.Растяжение (5000 повторений) - замедление атакующего.Укажите количество повторений, чтобы хэшировать пароль требуется около 0,1 секунды.Задержка на одну десятую секунды не будет замечена пользователем, вошедшим в систему, но это ограничит любого злоумышленника попыткой сделать не более десяти попыток в секунду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...