【发布时间】:2014-06-05 17:44:12
【问题描述】:
我知道 CryptProtectData 函数使用 windows 用户的密码加密数据,我可以在登录 crypter 用户时使用 CryptUnprotectData 函数解密它,如何仅使用密码而不是登录用户解密数据?
【问题讨论】:
标签: c++ winapi encryption
我知道 CryptProtectData 函数使用 windows 用户的密码加密数据,我可以在登录 crypter 用户时使用 CryptUnprotectData 函数解密它,如何仅使用密码而不是登录用户解密数据?
【问题讨论】:
标签: c++ winapi encryption
CryptProtectData 使用一种加密算法,该算法从环境变量(例如当前机器 ID 和用户凭据)派生其密钥。这也意味着在大多数情况下,您需要成为加密用户才能解密。
但是,有一个小警告,您可以绕过用户凭据进入密钥的组成;但遗憾的是,您能做的最好的事情就是加密可以被任何用户在同一台机器上解密的东西。
如here 所示,您可以将 dwFlags 设置为“CRYPTPROTECT_LOCAL_MACHINE”(dwFlags 是一个枚举,您可以简单地将其设置为 uint 0)。 当您在加密的东西上调用 CryptUnprotectData 时,请确保也将 dwFlags 设置为 uint(0),这两个函数将完全对称并且彼此正常工作。我亲自尝试过,可以证明它有效。
是的,需要同一个机器系统的整个过程真的很烦人,但它是迄今为止加密某些东西并确保世界上没有其他计算机可以解密它的最安全的方法。
希望这有帮助, 纳什万。
【讨论】:
CryptProtectData 可以使用 CRYPTPROTECT_LOCAL_MACHINE 标志,但这意味着任何用户都可以解密。使用 CRYPTPROTECT_LOCAL_MACHINE 基本上不会在用户级别保护任何内容,它只是在机器级别保护数据(即便如此,具有漫游配置文件的用户也可以解密)。 如果您只需要使用密码保护某些内容,请考虑改用 CryptGenKey 和 CryptEncrypt 函数(页面底部提供了用于加密和解密文件的示例)。
【讨论】: