Как Visual Studio шифрует пароли в файле .pub xml .user? - PullRequest
1 голос
/ 02 марта 2020

Когда вы указываете Visual Studio сохранить пароль для профиля publi sh, он создает файл .pubxml.user рядом с файлом publi sh, который выглядит примерно так:

<?xml version="1.0" encoding="utf-8"?>
<!--
This file is used by the publish/package process of your Web project. You can customize the behavior of this process
by editing this MSBuild file. In order to learn more about this please visit https://go.microsoft.com/fwlink/?LinkID=208121. 
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <TimeStampOfAssociatedLegacyPublishXmlFile />
    <EncryptedPassword>AQAAANC[...]</EncryptedPassword>
  </PropertyGroup>
</Project>

Как Visual Studio фактически шифрует пароль в элементе EncryptedPassword? Я хочу расшифровать его, потому что я забыл свой пароль ... теперь он просто хранится в зашифрованном виде в этом файле!

1 Ответ

2 голосов
/ 06 марта 2020

Данные DPAPI зашифрованы. Зашифрованные данные DPAPI начинаются с шестнадцатеричного числа с байтовой последовательностью 0x01000000D08C9DDF0115D1118C7A00C04FC297EB или Base64, кодированной с AQAAANCMnd8BFdERjHoAwE/Cl+, здесь .

Для расшифровки с помощью C# может использоваться класс ProtectedData или, точнее, метод stati c ProtectedData.Unprotect. Если значение энтропии не известно, s_aditionalEntropy, следует попробовать null. Более подробную информацию об этом параметре можно найти здесь .

Если зашифрованные данные кодируются в Base64, они должны быть декодированы в Base64 перед расшифровкой:

using System.Security.Cryptography;

...
String encryptedDataB64 = "AQAAANCMnd8BFdERjHoAwE/Cl+...";
byte[] encryptedData = Convert.FromBase64String(encryptedDataB64); 

byte[] s_aditionalEntropy = null;
byte[] data = ProtectedData.Unprotect(encryptedData, s_aditionalEntropy, DataProtectionScope.CurrentUser); 

Более подробный пример можно найти в связанной документации. Расшифровка не ограничена. NET, но также возможна для других языков при условии, что существует соответствующий DPAPI-упаковщик, например, в Python с win32crypt.CryptUnprotectData или в Java с Java DPAPI .

Вот консольная программа, которая получает строковое представление Unicode для декодированных данных:

using System;
using System.Security.Cryptography;

namespace ConsolePassDecrypter {
    class Program {
        static void Main(string[] args) {
            string encryptedPass = "AQAAANC[...]";
            var decryptedPassBytes = ProtectedData.Unprotect(Convert.FromBase64String(encryptedPass), null, DataProtectionScope.LocalMachine);
            Console.WriteLine("Decrypted pass: " + System.Text.Encoding.Unicode.GetString(decryptedPassBytes));
        }
    }
}
...