-1

是否有现有的安全实现来实现以下目标:


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 相比,映射应该保持全局​​唯一性(我不希望那些映射的 GUID 与现有的 GUID 发生冲突)。

- 在这种情况下,“安全”意味着在不知道密钥的情况下应该不可能找出原始 GUID(一个典型的加密请求,我认为这意味着映射的 GUID 应该具有标准化分布)。

4

3 回答 3

6

您可以轻松地做到这一点:

Guid original = Guid.NewGuid();
byte[] encrypted = Encrypt(original, key);
Guid decrypted = Decrypt(encrypted, key);

从 ROT13 开始,任何对称编码算法都可以。然而,这不是你要求的。您要求的是一种具有两个属性的算法:

  • 加密和解密算法完全相同。
  • GUID 的加密形式也是一个有效的全局唯一标识符

有很多算法的加密和解密过程是不同的,但实际上它们完全相同的地方并不多。加密和解密相同的最简单算法是:

  • 生成与明文长度相同的加密强度随机一次性填充。
  • 将明文与 pad 进行异或以产生密文。
  • 要解密,请将密文与 pad 进行异或。

但是,该算法不一定保持密文是有效 GUID 的属性

您能解释一下为什么需要密文成为有效的 GUID 吗?GUID 必须具有的属性是它必须是全局唯一的;您打算如何保证全球唯一性?是什么阻止了您将自己生成的一个 GUID 加密为其他人在您不知情的情况下生成的另一个 GUID?

更一般地说,您能解释一下您首先要解决的问题吗?在我看到有人试图使用密码学的十次中,有九次是他们将其用于错误的目的。

于 2013-04-23T13:46:14.010 回答
3

是的。那些神秘的算法被称为对称密码。你所说的只是算法的关键。

但是,从中获取 GUID 可能会有点困难,因为加密算法通常在数据流或数据块上运行,并且通过修改 GUID 会损害它的 GU 属性。

于 2013-04-23T13:27:58.333 回答
0

任何对称加密都可以

http://msdn.microsoft.com/en-us/library/as0w18af(v=vs.110).aspx

于 2013-04-23T13:29:41.967 回答