簡體   English   中英

等效於 Linux 上的數據保護 API

[英]Equivalent of Data Protection API on Linux

Microsoft Windows 2000 和更高版本公開了數據保護 API (DPAPI),它為每個用戶或每個系統上下文加密數據。 調用方不提供用於加密數據的密鑰。 而是使用從用戶或系統憑據派生的密鑰對數據進行加密。

此 API 通過ProtectedData類在 .NET 中方便地公開:

// Encrypts the data in a specified byte array and returns a byte array
// that contains the encrypted data.
public static byte[] Protect(
    byte[] userData,
    byte[] optionalEntropy,
    DataProtectionScope scope
)

// Decrypts the data in a specified byte array and returns a byte array
// that contains the decrypted data.
public static byte[] Unprotect(
    byte[] encryptedData,
    byte[] optionalEntropy,
    DataProtectionScope scope
)

Linux 上是否有等效的 API? 一個好處是它可以方便地與 Java 集成。

如果沒有,我的選擇是什么?

Linux 上的用戶級密鑰存儲有兩個選項:

這並沒有解決對系統級密鑰庫的需求。

它看起來並不比 PGP 或Pretty Good Privacy更先進(或更低)。 有一些可用於 PGP 的 API,我記得其他人善意地談到的 API 是Bouncy Castle

這是某人如何使用 Bouncy Castle示例

可能有更好的 API 或解決方案可用,具體取決於您的特定需求。

DPAPI 在 Linux 上不存在。

Windows 使用特殊的機器 ID 來偏離機器密鑰。 您可以通過查看“HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography\\MachineGuid”讀取此密鑰並使用您想要的任何加密庫偏離您的特殊密鑰來模擬此行為。

另一方面,在 Linux 下,此機器 ID 存儲在文件“/etc/machine-id”中。 您可以閱讀它的內容並從中偏離您的特殊鍵。 請注意,在使用快速部署 VM 時,此密鑰可能相同。

用這個特殊的機器 ID 加密你的數據,它不能被其他機器讀取。 首先讀取機器 ID(Linux 或 Windows),然后嘗試解密數據內容。 在另一台機器上,結果顯然會不同並且不正確。

您可以使用上面的信息對平台無關的包裝器類進行編碼。

希望這對將來的人有所幫助。

干杯

https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/introduction?view=aspnetcore-5.0

這里!

這個文檔太好了,我什至懶得解釋更多。 不要因為第一頁上沒有直接的代碼示例而氣餒。 那里的鏈接中有示例。 適用於所有場景。 DI、ASP.NET、控制台。 Windows 和 Linux。

正如我之前的其他人所說 - AFAIK 在 Linux 中您沒有用戶和系統的默認密鑰。 但鑰匙就是鑰匙。 您可以創建它們,並且在 Linux 上,您(作為管理員/root 用戶)有責任保護密鑰文件(意味着只有授權用戶才能訪問它們)。

好的部分是您不依賴於系統特定的鍵。 您只需使用單獨的密鑰,即您的應用程序密鑰。

如果這就是您所需要的 - 鏈接的 API 只適合您。 我希望 Linux 為用戶內置了默認密鑰,但是……這只是提高應用程序級安全性的一個額外步驟。 你還想多走一步嗎? 使用 Azure Key Vault,它們有很好的 REST API,你可以在任何地方使用,不一定在 Dotnet 中。 是的,AKV 需要本地存儲的用戶密碼,但您可以遠程禁用訪問,因此它是一個很好的附加安全層。 如果您的用戶/機器遭到入侵,您只需禁用該密鑰並禁用目標應用程序,直到您向用戶提供新密鑰。 我經常在我的敏感應用程序中使用它。 很有魅力。

順便說一句,我的 Linux DPAPI 使用的簡約示例:

using System;
using System.IO;

using Microsoft.AspNetCore.DataProtection;

var keyDirectory = Directory.GetCurrentDirectory();
var dataProtectionProvider = DataProtectionProvider.Create(new DirectoryInfo(keyDirectory));
var protector = dataProtectionProvider.CreateProtector("Test");
var password = "Secret1337";
var protectedPassword = protector.Protect(password);
Console.WriteLine($"Protected: {protectedPassword}");
var decodedPassword = protector.Unprotect(protectedPassword);
Console.WriteLine($"Decoded: {decodedPassword}");

當然,在現實世界的應用程序中,您不會將密鑰存儲在當前目錄中,但這是我能想到的最簡單的示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM