Win32 API中CredentialBlob明文存储的加密方式咨询
Win32 CredWriteW 凭据存储后CredentialBlob明文问题解答
你通过以下代码使用Win32 API保存新凭据:
CREDENTIALW cred = { 0 }; ... cred.Type = CRED_TYPE_GENERIC; cred.TargetName = convert("PIN"); cred.CredentialBlob = (LPBYTE)pBlob; // value here: "password" .. BOOL ok = ::CredWriteW(&cred, 0); ...
再通过以下代码读取该凭据:
PCREDENTIALW pcred; BOOL ok = ::CredReadW(L"PIN", CRED_TYPE_GENERIC, 0, &pcred);
发现CredentialBlob中的密码以明文形式显示,疑问是否需要单独对CredentialBlob进行加解密,还是可以通过Win32 API直接加密该值。
解答
CredWriteW本身会自动对CredentialBlob进行加密存储,你读取时看到明文是API的正常行为:
- 调用
CredWriteW时,系统会基于当前登录用户的安全上下文对CredentialBlob加密,最终存储在磁盘上的内容是加密状态,并非明文。 - 调用
CredReadW时,系统会自动完成解密操作,所以你获取到的pcred->CredentialBlob是明文形式——这是API封装好的逻辑,帮你省去了手动加解密的步骤。 - 若直接查看凭据存储的底层文件(如
%USERPROFILE%\AppData\Local\Microsoft\Credentials下的文件),会看到内容是加密的,只有当前登录用户(或拥有系统级权限的进程)才能解密读取。
除非你的业务场景有特殊的加密需求(比如自定义密钥、跨用户共享等),否则完全不需要手动对CredentialBlob进行加解密,依赖Win32凭据API的自动加密机制即可满足安全需求。
内容的提问来源于stack exchange,提问作者Emil
相关产品推荐
相关产品推荐

