我可以安全地保存密码并在不询问主密码的情况下检索它们吗?
Can I save passwords securely and retrieve them without asking for a master password?
我正在尝试了解如何安全地保存在我的应用程序中使用的密码,这样用户就不必记住它们,但与此同时,没有人可以让他们查看我的应用程序中的数据。
我想包含密码的文件应该被加密,我怀疑用户是否必须输入 "master password" 来检索存储的密码,或者是否有任何方法只有我的应用程序可以检索它们没有用户的任何输入。
我的应用程序是否可以在用户无需输入主密码的情况下检索密码?这是怎么做到的?
在 Windows 上,您最好的解决方案是使用 数据保护 API,Chrome、IE、远程桌面连接、以及其他数十种技术,用于加密数据。
优点是使用用户自己的 Windows 密码对数据进行加密(以循环方式)。当用户在 Windows 中输入密码时,所有 "protected" 数据都可用。
特点:
- 数据已加密
- 用户无需输入密码即可加密数据
- 只有用户才能解密
- 用户无需输入密码即可解密数据
示例伪代码
你要的API是CryptProtectData
和CryptUnprotectData
:
public bytes[] ProtectBytes(bytes[] plaintext)
{
DATA_BLOB dataIn;
dataIn.cbData = plaintext.Length;
dataIn.pbData = Addr(plaintext[0]);
DATA_BLOB dataOut;
BOOL bRes = CryptProtectData(
dataIn,
null, //data description (optional PWideChar)
null, //optional entropy (PDATA_BLOB)
null, //reserved
null, //prompt struct
CRYPTPROTECT_UI_FORBIDDEN,
ref dataOut);
if (!bRes) then
{
DWORD le = GetLastError();
throw new Win32Error(le, "Error calling CryptProtectData");
}
//Copy ciphertext from dataOut blob into an actual array
bytes[] result;
SetLength(result, dataOut.cbData);
CopyMemory(dataOut.pbData, Addr(result[0]), dataOut.cbData);
//When you have finished using the DATA_BLOB structure, free its pbData member by calling the LocalFree function
LocalFree(HANDLE(dataOut.pbData)); //LocalFree takes a handle, not a pointer. But that's what the SDK says.
}
稍后,当您需要解密 blob 时,您使用 CryptProtectData
。
数据使用用户的 Windows 密码(有效)加密;只有知道 Windows 密码的人才能解密。
Note: Any code released into public domain. No attribution required.
我正在尝试了解如何安全地保存在我的应用程序中使用的密码,这样用户就不必记住它们,但与此同时,没有人可以让他们查看我的应用程序中的数据。
我想包含密码的文件应该被加密,我怀疑用户是否必须输入 "master password" 来检索存储的密码,或者是否有任何方法只有我的应用程序可以检索它们没有用户的任何输入。
我的应用程序是否可以在用户无需输入主密码的情况下检索密码?这是怎么做到的?
在 Windows 上,您最好的解决方案是使用 数据保护 API,Chrome、IE、远程桌面连接、以及其他数十种技术,用于加密数据。
优点是使用用户自己的 Windows 密码对数据进行加密(以循环方式)。当用户在 Windows 中输入密码时,所有 "protected" 数据都可用。
特点:
- 数据已加密
- 用户无需输入密码即可加密数据
- 只有用户才能解密
- 用户无需输入密码即可解密数据
示例伪代码
你要的API是CryptProtectData
和CryptUnprotectData
:
public bytes[] ProtectBytes(bytes[] plaintext)
{
DATA_BLOB dataIn;
dataIn.cbData = plaintext.Length;
dataIn.pbData = Addr(plaintext[0]);
DATA_BLOB dataOut;
BOOL bRes = CryptProtectData(
dataIn,
null, //data description (optional PWideChar)
null, //optional entropy (PDATA_BLOB)
null, //reserved
null, //prompt struct
CRYPTPROTECT_UI_FORBIDDEN,
ref dataOut);
if (!bRes) then
{
DWORD le = GetLastError();
throw new Win32Error(le, "Error calling CryptProtectData");
}
//Copy ciphertext from dataOut blob into an actual array
bytes[] result;
SetLength(result, dataOut.cbData);
CopyMemory(dataOut.pbData, Addr(result[0]), dataOut.cbData);
//When you have finished using the DATA_BLOB structure, free its pbData member by calling the LocalFree function
LocalFree(HANDLE(dataOut.pbData)); //LocalFree takes a handle, not a pointer. But that's what the SDK says.
}
稍后,当您需要解密 blob 时,您使用 CryptProtectData
。
数据使用用户的 Windows 密码(有效)加密;只有知道 Windows 密码的人才能解密。
Note: Any code released into public domain. No attribution required.