用户认证Bcrypt和Sinatra - LINK - 请帮助解释

时间:2013-02-01 08:32:43

标签: authentication encryption sinatra haml bcrypt-ruby

http://www.128bitstudios.com/2011/11/21/authentication-with-sinatra/

简单而美观的Sinatra BCrypt认证系统 - 我很感激解释=)

我发现这篇非常好的文章是关于一个非常简单的使用BCrypt一起为Sinatra制作的认证系统,我认为它非常简单,并且有一个很好的继续经典代码。

然而,我无法理解它,是的,我是一个菜鸟。如果你们中的一些人能够向我解释至少一些代码,我真的很感激,而我特别感兴趣的是这部分

post "/signup" do
  password_salt = BCrypt::Engine.generate_salt
  password_hash = BCrypt::Engine.hash_secret(params[:password], password_salt)

  #ideally this would be saved into a database, hash used just for sample
  userTable[params[:username]] = {
    :salt => password_salt,
    :passwordhash => password_hash 
  }

  session[:username] = params[:username]
  redirect "/"
end

post "/login" do
  if userTable.has_key?(params[:username])
    user = userTable[params[:username]]
    if user[:passwordhash] == BCrypt::Engine.hash_secret(params[:password], user[:salt])
      session[:username] = params[:username]
      redirect "/"
    end
  end
  haml :error
end

我认为代码没有任何问题,因为它是由那些比我更好的人编写的,但它可能包含错误,但很可能不会。由于我对Sinatra和BCrypt的使用都很陌生,如果有人能够解释程序及其加密密码的方式,我将不胜感激。

当您访问该链接时,所有其余代码都在那里,没有必要在这里粘贴所有内容。

另外我想如果我已经正确理解了BCryptEngine从用户参数创建了一个盐:密码,但我无法理解它如何将用户保存到表和所有的etceteral东西。谢谢:))

1 个答案:

答案 0 :(得分:1)

如果你想实现这样的事情,你至少应该明白你在做什么,而不是简单地问这里。有一些简单的事情正在发生,例如将用户数据保存在请求之间没有保留的Hash中,因此除非您知道存储用户数据的位置,否则无法实现。数据库可能是目前最好的答案。

salt不是从用户密码创建的,它由BCrypt生成并存储在userTable Hash中。随着哈希密码。在注册例程中,userTable获取一个包含新用户的条目,但除非你将Hash保存在某个地方,否则它会在下一个请求后丢失。

我建议先阅读基本的Ruby使用方法。如果您想在应用程序中实现安全性,那么了解您的最新动态是有意义的。否则,如果安全性是安全的,那么它或多或少是纯粹的机会。