我想生成8位数的序列号字母数字。 但我也想隐藏/加密这个号码,所以没有人可以判断下一个号码。而且我想在加密或总和改组机制之后保持长度。
例如我的系列如下: 1000002A 1000002B 1000002C
答案 0 :(得分:1)
你可以获取你的号码的md5,但你最好生成纯随机系列并将它们存储在某个地方,在DB中可能是。
请注意,MD5不是加密而是哈希,它从任意长度的字符串计算固定长度的字节序列(16)。这是一种单向过程,您永远无法根据MD5结果计算初始字符串。
编辑:人们推荐SHA-2,另一个哈希函数:http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha256cryptoserviceprovider.aspx
编辑:为了防止暴力攻击,您应该在字符串中添加salt,然后应用哈希函数。示例:从hash("1000002A" + "00523422E8AB604F90C80D43C5F6C0F6")
答案 1 :(得分:0)
您可以添加一个只有您知道的随机字符串和hash两者。这使得其他人无法找到下一个号码。如果您只是对序列号进行哈希处理,只要有人了解它,他就可以尝试这些数字,直到他得到正确的哈希值,然后找出下一个数字。
但是我也建议只创建一个随机值。如果您丢失了秘密字符串,则所有数字 - >哈希对都会被“破解”。
答案 2 :(得分:0)
如果您只想将此序列号用作标识符,则可以使用随机UUID。它们是128位长,所以有十六个十六进制字符(如果需要,还有连字符)。
如果序列的顺序对您而言不重要,而不是公共方面,则可以存储UUID< - >数据库中的序列号对应关系。
如果大小是个问题,你会发现MD5哈希值也是128位长,而SHA-1哈希值是160位长。我不确定截断这样的哈希或UUID是如何影响随机性的。它肯定会增加碰撞的概率,但也可能存在关于熵的副作用。
编辑:关于尺寸的进一步评论,因为这是此问题的重要要求。
如果您需要输出最多8个字符[0-9A-Z],那么可能是36 ^ 8个值。从2 ^ 41< 36 ^ 8< 2 ^ 42,你希望结果最多使用41位。
您可以使用41位的stream cipher或block cipher(可能与公钥算法结合使用),您将是唯一知道(共享)密钥的人。这可能没什么问题,但是你需要注意不要让例子说明文字,因为那可能很容易被攻击。 我不太了解你对安全密钥长度给出更准确的建议,但如果你看一下comparison of stream ciphers(假设维基百科上的信息是准确的),很少有人看起来不到80位而不是在相对较短的时间内可攻击。同样,关于block ciphers的条目说“截至2006年,80位通常被视为防止暴力攻击所需的最小密钥长度。”
本文档也可能有用:“How to Calculate the Size of Encrypted Data?”。
基本上,它取决于你的意思“没有人可以判断下一个数字”。我认为你可能会在如此短的时间内获得一定程度的混淆,但这可能无法抵抗严重的攻击者,特别是因为他们知道它是一个序列可能对他们有所帮助。