System.Security.Cryptography.ProtectedData如何生成唯一标识符?

4
我使用 System.Security.Cryptography.ProtectedData 来保护许可证数据,然后将其写入注册表。
ProtectData.Protect(Byte[], Byte[], DataProtectionScope.LocalMachine)

数据保护范围是LocalMachine。

ProtectData用于加密字符串的参数是什么?如果我将加密后的字符串复制到另一台机器上,它能正常工作吗?

一些用户报告有许可问题,ProtectedData是否一致?


这是DPAPI的CryptProtectData函数的包装器,有很多文档;https://msdn.microsoft.com/en-us/library/windows/desktop/aa380261%28v=vs.85%29.aspx - Alex K.
@AlexK。我看了一下。如果我使用本地机器范围,那么如果用户更改密码或更改硬件之类的操作,密钥会发生变化吗? - techno
2个回答

4
在LocalMachine范围内,受保护的数据与机器上下文相关联。计算机上运行的任何进程都可以解除数据的保护。这个枚举值通常用于在不允许未经信任的用户访问的服务器上运行的服务器特定应用程序中。
注意:LocalMachine枚举值允许多个帐户解除数据的保护。只有在您信任计算机上的每个帐户时才使用此值。对于大多数情况,应使用CurrentUser值。
加密数据只能在加密它的同一台机器上解密。
DPAPI使用主密钥(512位随机数据)生成用于加密和解密的会话密钥。这意味着它将保持完好,直到重新安装操作系统。

https://msdn.microsoft.com/en-us/library/ms995355.aspx


1
谢谢。但我正在寻找更多细节。比如说,这个方法在加密时是否考虑了机器的硬件参数?如果硬件发生变化,它还能工作吗? - techno
@techno 主密钥和会话密钥是随机生成的密钥,这意味着它们不依赖于硬件。请查看更新的答案。 - Kambiz Shahim
@techno,这不会成为问题,因为它不依赖于特定的用户,机器上的任何用户都可以解密本地机器范围加密的数据。 - Kambiz Shahim
这不会是问题,该产品按计算机而非用户授权。 - techno
@techno,关于许可证问题,我建议不要使用ProtectData进行加密/解密,而是使用非对称算法来保护数据,以防止用户访问您的许可证数据。您可以保留私钥,并仅嵌入公钥用于解密。 - Kambiz Shahim
显示剩余2条评论

1

Reflector显示ProtectData.Protect基本上是crypt32.dll的CryptProtectData()函数的包装器。

来自MSDN:(https://msdn.microsoft.com/zh-cn/library/windows/desktop/aa380261(v=vs.85).aspx)

CryptProtectData函数对DATA_BLOB结构中的数据执行加密。通常,只有与加密数据的用户具有相同登录凭据的用户才能解密数据。此外,加密和解密通常必须在同一台计算机上完成。


LocalMachine 范围将数据与当前计算机关联起来,而不是与单个用户关联。在调用 CryptProtectData 的计算机上的任何用户都可以使用 CryptUnprotectData 解密数据。 - Kambiz Shahim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接