偏执狂安全的UUID生成

我需要在分布式系统上生成许多独特的标识符。

  • 偏执狂模式下,我不能确定:
  • 永远不会碰撞
  • 阻止确定用于生成标识符的计算机位置 (Mac地址和日期时间)
  • 我认为生成UUID。

  • 如果我使用UUID1(基于MAC地址,时间戳等):

  • 我一定不会碰撞
  • 可以找到位置
  • 如果我使用UUID4(基于随机生成器):

  • 有可能发生碰撞(碰撞的可能性确实非常小, 但存在!
  • 我相信这是不可能的位置(日期和电脑)
  • 你有解决方案来满足这两个约束?


    可能我们可以将UUID1与通过“秘密”键确定的“静态排列”功能结合起来吗? 该功能必须是双射的。

    灵感来自:http://code.activestate.com/recipes/126037-getting-nth-permutation-of-a-sequence/

    def getPerm(seq, index):
        "Returns the <index>th permutation of <seq>"
        seqc= list(seq[:])
        seqn= [seqc.pop()]
        divider= 2 # divider is meant to be len(seqn)+1, just a bit faster
        while seqc:
            index, new_index= index//divider, index%divider
            seqn.insert(new_index, seqc.pop())
            divider+= 1
        return "".join(seqn)
    
    
    secret=123456**123456 # a big secret integer
    
    secure_id=getPerm("af5f2a30-aa9e-11e7-abc4-cec278b6b50a",secret)
    # "1-a-faa4cba8c5b0ae372a72-ec-1fb9560e" ==> Same character, just change order
    
    secure_id=getPerm("aaaaaaa0-bbbb-cccc-xxxx-yyyyyyyyyy0y",secret)
    # "c-b-axaxxybyyyx0ybacyaya-cy-caybay0y" ==> Same secret => Same permutation  (check position of caracter '0' and '-')
    

    我们可以通过保留' - 'caracter的位置来改进置换“混淆”


    也许我们可以简单地对UUID进行编码,使用Base64来轻松传送/存储ID。 编码也是一种双向函数。

    import base64
    
    def encode(string,key):
        encoded_chars = []
        for i in xrange(len(string)):
            key_c = key[i % len(key)]
            encoded_c = chr((256 + ord(string[i]) + ord(key_c)) % 256)
            encoded_chars.append(encoded_c)
        encoded_string = "".join(encoded_chars)
        return base64.urlsafe_b64encode(encoded_string)
    
    def decode(encoded_string,key):
        decoded_chars = []
        string=base64.urlsafe_b64decode(encoded_string)
        for i in xrange(len(string)):
            key_c = key[i % len(key)]
            decoded_c = chr((256 + ord(string[i]) - ord(key_c)) % 256)
            decoded_chars.append(decoded_c)
        encoded_string = "".join(decoded_chars)
        return "".join(decoded_chars)
    
    secure_id=encode("af5f2a30-aa9e-11e7-abc4-cec278b6b50a","secret")
    # "1MuY2JfVppWQ08at2JKUo8qroMbF1Zmh1srGpJys1ZvFp5XV"
    
    uuid=decode(secure_id,"secret")
    # "af5f2a30-aa9e-11e7-abc4-cec278b6b50a"
    

    这样,我总是有秘密的问题。

    (注意:我们不需要解码功能)

    链接地址: http://www.djcxy.com/p/91483.html

    上一篇: Paranoia secure UUID generation

    下一篇: SecureRandom.uuid vs UUID gem