是否存在实现以下的现有安全实施:
Guid original = Guid.NewGuid();
Guid inverted = MysteryImplementation(original, salt); // salt is some sort of input
Guid shouldBeOriginal = MysteryImplementation(inverted, salt);
Assert.AreEqual(original, shouldBeOriginal, "MysteryImplementation did no work");
编辑:
由于这次投票失败(虽然我有点不确定为什么),我认为需要更多背景:
在遥远的地方,有一个应用程序,其中主键存储为GUID。在此应用程序中,这些GUID向Web客户端公开。
在我追求改善现状的过程中,我有一个想法,即将这些GUID与用户会话数据进行映射,以降低主键意外/恶意泄漏的风险。映射这些GUID具有额外的好处,它还可以更容易地为GUID引用的那些对象实现工作副本。
这就是为什么我决定开始寻找“安全”方式来映射GUID的原因。
回答评论:
- 与所有其他GUID相比,-Mapping应保留全局唯一性(我不希望这些映射的GUID与现有GUID冲突)。
- 在此上下文中的“安全”意味着在不知道密码密钥(典型的加密请求,我认为转换映射的GUID应该具有规范化分布)的情况下找出原始GUID是不可能的。
答案 0 :(得分:6)
您可以轻松地执行此操作:
Guid original = Guid.NewGuid();
byte[] encrypted = Encrypt(original, key);
Guid decrypted = Decrypt(encrypted, key);
任何对称编码算法都可以从ROT13开始执行。但是,这不是你要求的。您要求的是一种具有两个属性的算法:
有很多算法,加密和解密过程不同,但实际上并不是很多,它们完全相同。加密和解密相同的最简单算法是:
然而该算法不一定保持密文是有效GUID的属性。
您能解释一下为什么您需要密文才能成为有效的GUID吗? GUID必须具有的属性是它必须全局唯一;您打算如何保证全球唯一性?是什么阻止您将您生成的一个GUID加密到另一个其他人不知道的生成的GUID?
更一般地说,你能解释你首先想要解决的问题吗?我看到有人试图使用加密技术的九次中有九次使用它来表示错误目的。
答案 1 :(得分:3)
是。那些神秘算法被称为symmetric ciphers。您所谓的 salt 只是算法的关键。
然而,由于加密算法通常在数据流或数据块上运行,并且通过修改GUID来破坏它的GU属性,因此可能有点难以从中获取GUID。
答案 2 :(得分:0)