首页 > 解决方案 > 在 Ruby 中将字符串加密或散列为十进制数

问题描述

在我们的一个注册过程中,在一个 Ruby on Rails 应用程序中,我想向某人发送一封电子邮件,其中包含一个 6 位数字代码,他们需要将其复制或输入到页面上的框中。

我想我可能会这样做是在页面上的一个隐藏字段中添加一个字符串,例如,在生成电子邮件时,它与我们代码库中的一些密钥组合,然后散列或加密为一系列十进制数字. 然后,我将其中的最后六个放入电子邮件中。

提交表单后,使用原始字符串和用户输入的 6 位数字,我可以对字符串重复该过程并测试它是否产生与用户输入的相同的 6 位数字。

问题是:如何对字符串进行哈希/加密以获得一系列十进制数字?原始字符串可以是任何东西(包括一组不同的十进制数字),它只需要是真正随机生成的东西。

标签: rubyencryptionhash

解决方案


注意: 请勿将此用作安全措施。您已声明您打算仅将其用作一种 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

然后,您可以存储其中的任何部分以及到期时间。


推荐阅读