Algorithm 如何生成一组易于检查但难以伪造的(短)唯一标识符?

Algorithm 如何生成一组易于检查但难以伪造的(短)唯一标识符?,algorithm,security,Algorithm,Security,例如,许多软件使用的许可证密钥。我曾想过对一个序列进行加密签名,所以我可能有4个字节的ID,比如说8个字节的签名,但我找不到合适的算法 我需要的是攻击者无法轻易生成的东西,但它存储在大约20个ASCII字节内。我还需要对独特性充满信心。这不需要是完全安全的,只需要防止偶然的攻击 注意:我是在appengine上用java实现的。听起来像。不过,您可能需要手动确保唯一性。将包含id的值计算到字符串中,并使用基于字节的HDMAC和密钥以及最大长度。只需确保要加密的值中有唯一的部分。这可能是服务器时间

例如,许多软件使用的许可证密钥。我曾想过对一个序列进行加密签名,所以我可能有4个字节的ID,比如说8个字节的签名,但我找不到合适的算法

我需要的是攻击者无法轻易生成的东西,但它存储在大约20个ASCII字节内。我还需要对独特性充满信心。这不需要是完全安全的,只需要防止偶然的攻击


注意:我是在appengine上用java实现的。

听起来像。不过,您可能需要手动确保唯一性。

将包含id的值计算到字符串中,并使用基于字节的HDMAC和密钥以及最大长度。只需确保要加密的值中有唯一的部分。这可能是服务器时间或其他ID。需要测试长度是否在您20个字符的要求范围内。

只需为每个ID生成一个ID,并跟踪您在数据库中生成的ID。guid的范围如此之大,以至于每个guid都是独一无二的。它不是加密的,所以有一种可能性,任何人只要有足够多的你生成的人就可以产生一个匹配,但我认为可能性仍然很小


GUID为128位,可以使用23字节进行编码。

加密是可逆的,因此对于唯一的输入,输出是唯一的。每次只需使用相同的密钥加密0、1、2、3、4、5等。对于128位输出,在ECB模式下使用AES和128位数字。其他模式也需要相同的IV/NONCE。对于64位数字,使用DES。对于其他尺寸的数字,可以使用仓促布丁密码,也可以根据您想要的尺寸滚动您自己的简单Feistel密码


ECB不是最安全的模式,但我不认为您在这里寻求非常高的安全级别。

这可以在少量字节内完成吗?越小越好,因为我将在QR码中使用它们…@RichardRussell HMAC的长度与基础哈希的长度相同,例如MD5为128位(十六进制为32字节,base64为24字节,您可能无法仅使用16字节的二进制表示)。如果您需要以某种方式识别密钥,还需要将您的ID附加到密钥上。