Yo soy bastante despistado, y cuando estoy intentando resolver un problema y me pasan la contraseña de una base de datos me olvido de anotarla, y simplemente la dejo guardada en el "vault" del Mysql Workbench. Cuando la necesito en otro equipo tengo que volver a pedirlas con el engorro que eso supone.
Para eso hice este pequeño trozo de codigo que descifra el fichero de contraseñas del workbench y muestra el contenido por consola
program workbenchpass; {$APPTYPE CONSOLE} uses SysUtils, Windows, Classes; type TDATA_BLOB = record cbData: DWORD; pbData: PByte; end; PDATA_BLOB = ^TDATA_BLOB; TCRYPTPROTECT_PROMPTSTRUCT = record cbSize: DWORD; dwPromptFlags: DWORD; hwndApp: HWND; szPrompt: PWChar; end; PCRYPTPROTECT_PROMPTSTRUCT = ^TCRYPTPROTECT_PROMPTSTRUCT; const CRYPTPROTECT_UI_FORBIDDEN = 1; function CryptProtectData(pDataIn: PDATA_BLOB; szDataDescr: PWChar; pOptionalEntropy: PDATA_BLOB; pvReserved: Pointer; pPromptStruct: PCRYPTPROTECT_PROMPTSTRUCT; dwFlags: DWORD; pDataOut: PDATA_BLOB ): BOOL; stdcall; external 'Crypt32.dll'; function CryptUnprotectData(pDataIn: PDATA_BLOB; szDataDescr: PWChar; pOptionalEntropy: PDATA_BLOB; pvReserved: Pointer; pPromptStruct: PCRYPTPROTECT_PROMPTSTRUCT; dwFlags: DWORD; pDataOut: PDATA_BLOB ): BOOL; stdcall; external 'Crypt32.dll'; function Min(i,j: Integer): Integer; begin if i < j then Result:= i else Result:= j; end; procedure WriteHex(Buffer: PAnsiChar; Count: Integer); var i,j: Integer; begin j:= 0; while Count > 0 do begin Write(IntToHex(j,8) + ':' + #32#32); for i:= 0 to Min(Count,8) - 1 do Write(IntToHex(Byte(Buffer[i]),2) + #32); Write(#32); for i:= 8 to Min(Count,16) - 1 do Write(IntToHex(Byte(Buffer[i]),2) + #32); for i:= Min(Count,16) to 15 do Write(#32#32#32); Write(#32 + '|'); for i:= 0 to Min(Count,16) - 1 do if Char(Buffer[i]) in ['A'..'Z','a'..'z','0'..'9'] then Write(Buffer[i]) else Write('.'); Writeln('|'); Dec(Count,16); inc(Buffer,16); inc(j,16); end; end; var Src, Dst: TDATA_BLOB; begin try with TMemoryStream.Create do try if ParamStr(1) <> EmptyStr then LoadFromFile(ParamStr(1)) else LoadFromFile(IncludeTrailingPathDelimiter(GetEnvironmentVariable('APPDATA')) + 'MySQL\Workbench\workbench_user_data.dat'); Src.cbData:= Size; Src.pbData:= Memory; FillChar(Dst,Sizeof(Dst),#0); if CryptUnProtectData(@Src,nil,nil,nil,nil,CRYPTPROTECT_UI_FORBIDDEN,@Dst) then try WriteHex(PAnsiChar(Dst.pbData), Dst.cbData); finally LocalFree(Cardinal(Dst.pbData)); end; finally Free; end; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Writeln; Writeln('Pulsa enter para salir ...'); Readln; end.
Saludos