http://www.128bitstudios.com/2011/11/21/authentication-with-sinatra/
我发现这篇非常好的文章是关于一个非常简单的使用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东西。谢谢:))
答案 0 :(得分:1)
如果你想实现这样的事情,你至少应该明白你在做什么,而不是简单地问这里。有一些简单的事情正在发生,例如将用户数据保存在请求之间没有保留的Hash中,因此除非您知道存储用户数据的位置,否则无法实现。数据库可能是目前最好的答案。
salt不是从用户密码创建的,它由BCrypt生成并存储在userTable Hash中。随着哈希密码。在注册例程中,userTable获取一个包含新用户的条目,但除非你将Hash保存在某个地方,否则它会在下一个请求后丢失。
我建议先阅读基本的Ruby使用方法。如果您想在应用程序中实现安全性,那么了解您的最新动态是有意义的。否则,如果安全性是安全的,那么它或多或少是纯粹的机会。