带有tr的SecureRandom字符串翻译显示下划线的丰富程度?

时间:2014-03-26 04:08:29

标签: ruby-on-rails random devise passwords

我正在使用Devise并尝试使用Devise.friendly_token生成密码,但却发现它产生了不需要的特殊字符。我发现Devise.friendly_token实际上使用了这种方法:

SecureRandom.urlsafe_base64(15).tr('lIO0', 'sxyz')

试图删除" - "," ="的特殊字符。和" _",我用:

替换了Devise.friendly_token调用
SecureRandom.urlsafe_base64(15).tr('lIO0=-_', 'sxyzEMU')

然而,我发现有过多的" U"替换了下划线的字符(显然其中一些实际上是" U")。所以,我尝试了这个电话,取消了" _"到" U"。

SecureRandom.urlsafe_base64(15).tr('lIO0=-', 'sxyzEM')

这显示了更合理的结果分布,但它仍然留下了下划线的特殊性。

任何人都可以告诉我为什么会这样,以及如何解决它?示例输出为:

irb(main):017:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-_', 'sxyzEMU').first(8)
=> "mvgjptsy"
irb(main):018:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-_', 'sxyzEMU').first(8)
=> "UUh1fUU-"
irb(main):019:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-_', 'sxyzEMU').first(8)
=> "UgU4U981"
irb(main):020:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-_', 'sxyzEMU').first(8)
=> "UUUU1q27"
irb(main):021:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-_', 'sxyzEMU').first(8)
=> "ajU7zjUn"
irb(main):022:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-_', 'sxyzEMU').first(8)
=> "UxgUwt7U"
irb(main):023:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-_', 'sxyzEMU').first(8)
=> "UUpUcUvU"
irb(main):024:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-_', 'sxyzEMU').first(8)
=> "U4UbU2ho"
irb(main):025:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-_', 'sxyzEMU').first(8)
=> "icsU7bcs"
irb(main):026:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-_', 'sxyzEMU').first(8)
=> "5vfdfUoU"
irb(main):027:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-', 'sxyzEM').first(8)
=> "1Q71wib4"
irb(main):028:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-', 'sxyzEM').first(8)
=> "TzkKT9s6"
irb(main):029:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-', 'sxyzEM').first(8)
=> "iWGBgys_"
irb(main):030:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-', 'sxyzEM').first(8)
=> "hkxNPGKg"
irb(main):031:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-', 'sxyzEM').first(8)
=> "sHMDeAsc"
irb(main):032:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-', 'sxyzEM').first(8)
=> "Tov7bYaB"
irb(main):033:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-', 'sxyzEM').first(8)
=> "4vMLFdSJ"
irb(main):034:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-', 'sxyzEM').first(8)
=> "zxstSvs8"
irb(main):035:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-', 'sxyzEM').first(8)
=> "rMEdizyG"
irb(main):036:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-', 'sxyzEM').first(8)
=> "gXK33_ux"

1 个答案:

答案 0 :(得分:8)

- String#tr字符用于表示一系列字符。如果你的意思是-,你需要用反斜杠来逃避它。该示例正在将=更改为E,将>更改为M,将所有字符从?更改为_(包括所有大写字母) U,因此U的丰富。

要获得预期的结果,请使用:

SecureRandom.urlsafe_base64(15).tr('lIO0=\-_', 'sxyzEMU')