我使用的是DISQLite component,它支持AES加密,但是我仍然需要保护我用来解密的密码.读数据库.
我最初的想法是生成一个随机密码,使用类似DPAPI(CryptProtectData和CryptUnprotectData函数在Crypt32.dll中找到)中存储它,但是我找不到任何示例
解决方法
> CryptProtectData / CryptProtectMemory
> CryptUnprotectData / CryptUnprotectMemory
CryptProtectMemory / CryptUnprotectMemory提供更多的灵活性:
> CRYPTPROTECTMEMORY_SAME_PROCESS:只有您的进程可以解密您的数据
> CRYPTPROTECTMEMORY_CROSS_PROCESS:任何进程都可以查看您的数据
> CRYPTPROTECTMEMORY_SAME_logoN:只有使用相同用户运行的进程和在同一个会话中可以解密数据
优点:
>不需要钥匙 – Windows do it for you
>粒度控制:每个进程/每个会话/每个登录/每个机器
> CryptProtectData存在于Windows 2000及更高版本中
> DPAPI Windows比使用“安全”相关代码更安全,我和我认为Random()返回绝对随机数的人:)实际上,微软在安全领域拥有数十年的经验,拥有最多受攻击的操作系统:O)
缺点:
>在CRYPTPROTECTMEMORY_SAME_PROCESS的情况下,一个*只需要在你的进程中注入一个新的线程,这个线程就可以解密你的数据
>如果有人重置用户密码(不更改),您将无法解密您的数据
>在CRYPTPROTECTMEMORY_SAME_logoN的情况下:如果用户*运行黑客进程,它可以解密您的数据
>如果您使用CRYPTPROTECT_LOCAL_MACHINE – 该机器上的每个用户可以解密数据. This is why it’s not recommended to save passwords in .RDP files
> Known issues
无论如何 – 你有选择.
请注意,@ David-Heffernan是对的 – 存储在计算机上的任何东西都可以被解密 – 从内存中读取,在进程中注入线程
另一方面,为什么我们不要让饼干的生活更难?