没有数据库的注册或邀请电子邮件验证

Bla*_*ine 15 ruby database encryption encoding ruby-on-rails

我想让我的数据库保持陈旧的几乎帐户,我正在考虑制作新的注册和邀请将他们的数据作为加密或散列网址放入欢迎电子邮件中.访问URL中的链接后,该信息将作为帐户添加到数据库中.目前有什么东西吗?关于以这种方式进行用户注册的任何参考,想法或警告?谢谢!

编辑:我做了一个有效的例子,网址是127个字符.

http://localhost/confirm?_=hBRCGVqie5PetQhjiagq9F6kmi7luVxpcpEYMWaxrtSHIPA3rF0Hufy6EgiH%0A%2BL3t9dcgV9es9Zywkl4F1lcMyA%3D%3D%0A
Run Code Online (Sandbox Code Playgroud)

显然,更多数据=更大的网址

def create
# Write k keys in params[:user] as v keys in to_encrypt, doing this saves LOTS of unnecessary chars
  @to_encrypt = Hash.new
  {:firstname => :fn,:lastname => :ln,:email => :el,:username => :un,:password => :pd}.each do |k,v|
    @to_encrypt[v] = params[:user][k]
  end

  encrypted_params = CGI::escape(Base64.encode64(encrypt(compress(Marshal.dump(@to_encrypt)), "secret")))
end

private

def aes(m,t,k)
  (aes = OpenSSL::Cipher::Cipher.new('aes-256-cbc').send(m)).key = Digest::SHA256.digest(k)
  aes.update(t) << aes.final
end

def encrypt(text, key)
  aes(:encrypt, text, key)
end

def decrypt(text, key)
  aes(:decrypt, text, key)
end

# All attempts to compress returned a longer url (Bypassed by return)

def compress(string)
  return string
  z = Zlib::Deflate.new(Zlib::BEST_COMPRESSION)
  o = z.deflate(string,Zlib::FINISH)
  z.close
  o
end

def decompress(string)
  return string
  z = Zlib::Inflate.new
  o = z.inflate(string)
  z.finish
  z.close
  o
end
Run Code Online (Sandbox Code Playgroud)

Fil*_*ara 6

思考:

  • 使用真正的非对称密码作为"cookie"来防止机器人创建帐户.使用公钥加密"cookie",通过使用私钥解码来验证它.
    基本原理:如果仅使用base64或其他算法对cookie进行编码,则可以轻松地对方案进行反向工程并自动创建帐户.由于垃圾邮件,这是不可取的.此外,如果帐户受密码保护,则密码必须出现在cookie中.任何有权访问注册链接的人不仅可以激活帐户,还可以找出密码.

  • 通过链接激活后需要重新输入密码.
    理由:根据网站的目的,您可能希望改进对信息欺骗的保护.激活后重新输入密码可防止被盗/欺骗的激活链接.

  • 验证激活链接时,请确保未创建由其创建的帐户.

  • 如何防止两个用户同时创建一个具有相同名称的帐户?
    可能的答案:使用电子邮件作为登录标识符,不需要唯一的帐户名称.

  • 首先验证电子邮件,然后继续创建帐户.
    理由:这将最大限度地减少您在cookie中发送所需的信息.