偏执狂安全UUID生成

时间:2017-10-06 13:27:35

标签: python uuid

我需要在分布式系统上生成许多唯一标识符。

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

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

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

      • 可能发生碰撞(碰撞的可能性非常非常小,但存在!
      • 我确定不可能破坏位置(日期和计算机)
    3. 您是否有满足这两种限制的解决方案?

2 个答案:

答案 0 :(得分:0)

可能我们可以将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 '-')

我们可以改进排列&#34;混淆&#34;通过保留&#39; - &#39;的位置卡拉科特

答案 1 :(得分:0)

可能我们可以简单地编码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"

通过这种方式,我一直都是秘密问题。

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