【问题标题】:Can I save passwords securely and retrieve them without asking for a master password?我可以安全地保存密码并在不要求主密码的情况下检索它们吗?
【发布时间】:2016-01-15 09:42:07
【问题描述】:

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

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

我的应用程序能否在用户无需编写主密码的情况下检索密码?这是怎么做到的?

【问题讨论】:

  • 这个问题是特定于平台的。伊恩的回答非常适合 Windows。如果您需要其他内容,则需要指明您的平台。如果没有某种操作系统支持,这是不可能的。
  • 嗨 Rob,我们计划在 Android、iOS、Windows 和 OSX 上发布。我不知道它是特定于平台的。我认为应用程序有一种方法可以做到这一点。
  • 基本上你无法保护没有秘密的东西。最好的当然是在建立会话时只询问密码。如果你必须存储,Ian 的回答已经说明了方法:你需要系统支持。因此,请查看所选平台上提供给您的各种选项。这些不会相同,因此您可能需要定义一个通用接口,然后为每个平台实现它(如果您想保持相同的应用程序设计)。

标签: encryption cryptography


【解决方案1】:

在 Windows 上,您最好的解决方案是使用 Chrome、IE、远程桌面连接和许多其他技术使用的 数据保护 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 密码的人才能解密。

注意:任何发布到公共领域的代码。无需署名。

【讨论】:

    猜你喜欢
    • 2022-11-24
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 2011-07-02
    相关资源
    最近更新 更多