我可以安全地保存密码并在不要求主密码的情况下检索密码吗?

时间:2015-04-09 18:46:51

标签: encryption cryptography

我正在尝试了解如何安全地保存我的应用程序上使用的密码,因此用户不必记住它们,但同时没有人可以让他们查看我的应用程序中的数据。

我想包含密码的文件应该是加密的,我的疑问是用户是否必须输入“主密码”来检索存储的密码,或者是否有任何方式以便只有我的应用程序可以在没有任何输入的情况下检索它们来自用户。

我的应用可以在用户无需编写主密码的情况下检索密码吗?这是怎么做到的?

1 个答案:

答案 0 :(得分:1)

在Windows上,您最好的解决方案是使用Chrome,IE,远程桌面连接和其他许多技术使用的 Data Protection API 来加密数据。

优点是数据使用用户自己的Windows密码进行加密(以循环方式)。当用户在Windows中键入密码时,它会使所有“受保护”数据可用。

特点:

  • 数据已加密
  • 用户无需输入密码来加密数据
  • 只有用户可以解密它
  • 用户无需输入密码即可解密数据

示例伪代码

您想要的API是CryptProtectDataCryptUnprotectData

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密码的人才能解密它。

  

注意:任何已发布到公共领域的代码。无需归属。