在我们的一个注册过程中,在Ruby on Rails应用程序中,我想向某人发送一封带有6位数字代码的电子邮件,他们需要将其复制或键入页面上的一个框。
我认为我可能会这样做是在页面上有一个字符串,在隐藏字段中,比如说,在生成电子邮件时,它会与我们的代码库中的某个密钥组合,然后散列或加密到一个系列十进制数。然后,我将其中的最后六个放入电子邮件中。
提交表单时,使用原始字符串和用户输入的6位数字,我可以在字符串上重复该过程并测试它产生与用户输入的相同的六位数字。
问题是:如何散列/加密字符串以获取一系列十进制数?原始字符串可以是任何东西(包括一组不同的十进制数字),它只需要是真正随机生成的东西。
答案 0 :(得分:0)
注意: 请勿将此作为安全措施。您已经表示您打算仅将其用作diy验证码系统,并在此背景下提供此答案。
OpenSSL提供了良好的哈希函数。一旦你有了十六进制的哈希值,to_i
方法就会得到一个基本参数,所以转换为十进制很简单。然后返回一个字符串,因为这样可以更容易地获取最后一个字符。
require 'openssl'
hash = OpenSSL::Digest::SHA256.hexdigest('user@example.com' + Random.new_seed.to_s)
message = hash.to_i(16).to_s.chars.last(6).join
然后,您可以存储此部分的任何部分以及到期时间。