【问题标题】:Generate unique token from specific variable从特定变量生成唯一令牌
【发布时间】:2015-01-02 07:19:16
【问题描述】:

您将如何从特定变量(如设备 ID(字符串))生成唯一令牌以保护 rails api?

我正在寻找类似的东西:

SecureRandom.hash_algo(deviceId)

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    你可以用这个生成一个随机令牌:

    token = SecureRandom.urlsafe_base64(nil, false)
    

    编辑:

    require 'digest/sha1'
    Digest::SHA1.hexdigest deviceId
    

    【讨论】:

    • 如果我想生成一个基本的唯一令牌会很好,但在我的情况下,我希望 device id 参与哈希
    • 所以你不想生成唯一令牌而是哈希,所以使用像SHA1这样的哈希方法,看stackoverflow.com/questions/34490/…
    • 好的,但是像盐一样使用 deviceId 是没用的。使用哈希,您总是会得到与 deviceId 相同的结果,但如果您像使用盐一样使用 deviceId,您将始终得到不同的结果......
    • 在这种情况下你不需要盐,你只需要生成一个随机令牌。
    • 好的,我明白你的意思了。我只需要保留一对设备 ID 及其相关的随机令牌。无需将设备 ID 应用于令牌生成,因为在这两种情况下它都是随机的
    【解决方案2】:

    如果字符串必须是输入的摘要,而不是随机字符串,您可以使用Digest 库来生成哈希。可以找到几个例子in this answer

    require 'digest/sha2'
    Digest::SHA2.hexdigest(deviceId)
    

    否则,SecureRandom 库有一堆方法可以生成随机字符串。

    十六进制字符串。

    p SecureRandom.hex(10) #=> "52750b30ffbc7de3b362"
    p SecureRandom.hex(10) #=> "92b15d6c8dc4beb5f559"
    p SecureRandom.hex(13) #=> "39b290146bea6ce975c37cfc23"
    

    Base64 字符串。

    p SecureRandom.base64(10) #=> "EcmTPZwWRAozdA=="
    p SecureRandom.base64(10) #=> "KO1nIU+p9DKxGg=="
    p SecureRandom.base64(12) #=> "7kJSM/MzBJI+75j8"
    

    二进制字符串。

    p SecureRandom.random_bytes(10) #=> "\016\t{\370g\310pbr\301"
    p SecureRandom.random_bytes(10) #=> "\323U\030TO\234\357\020\a\337"
    

    【讨论】:

      猜你喜欢
      • 2016-01-24
      • 1970-01-01
      • 2014-04-16
      • 2013-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      相关资源
      最近更新 更多