从密钥生成随机字符串

时间:2015-08-30 12:54:19

标签: ruby random

给定密钥创建随机字母数字字符串的最佳方法是什么?我正在使用这个

(0...50).map { ('a'..'z').to_a[rand(26)] }.join

但是,我想要一个基于"mysecretkey"等字符串的字符串。我不想使用加密宝石或密码等。我想保持简单,就像我拥有的​​那样,但是为它添加一个密钥。

2 个答案:

答案 0 :(得分:2)

这个怎么样?

Random.rand("mysecretkey".hash).to_s(36)[0, 10]
# => "1lc1em343y"

答案 1 :(得分:1)

我假设您的问题是由于某种原因想要将输入字符串与随机输出相关联,并且如果显示相同的键,则将其设置为相同的输出。

以下代码将生成相同的"随机"相同输入密钥的字符串,接受最多8 * 624 = 4992字节长的密钥。从技术上讲,这不是随机的,而是使用Ruby内置的随机数生成器来对输入字符串进行散列。

def rand_hash secret_key
  int_key = secret_key.unpack("C*").each_with_index.inject(0) do |sum, (byte, index)|
    sum + byte * (256 ** index)
  end
  r = Random.new( int_key )
 (0...50).map { ('a'..'z').to_a[ r.rand(26) ] }.join
end

rand_hash "Hi, how are you today?"
# => "mwerzokwwtlqepizuqimbhxmzexmovzrwgvarjlfbkcqpffhoq"

rand_hash "Hi, how are you today?"
# => "mwerzokwwtlqepizuqimbhxmzexmovzrwgvarjlfbkcqpffhoq"

rand_hash "Hi, how are you today!"
# => "zeudwqltlozjdebamemplwllqftmyhdzapatqhdsbnrzfcrmss"

请参阅How do I unpack a number larger than 64 bits in ruby?,了解如何将secret_key从字符串解压缩为名为int_key的BigNum。

然后我们使用该键为Ruby Random对象播种(基于Mersenne Twister)

然后使用新的Random对象生成字符串,与原来的相同。

请注意,这是加密安全。如果你想要安全性,例如不可能反转输出并找到秘密,那么你应该使用安全的哈希机制(来自适当的gem,例如openssl),并将其转换为你需要的字符集。 / p>