Código fuente completo en C# con las librerías DLL necesarias para desarrollar una aplicación de consola a la que se le pasan dos contraseñas, una en texto plano y otra la cifrada por WordPress. La aplicación cifrará la contraseña plana con el método de WordPress y las comparará, si son iguales devolverá 32, si son diferentes devolverá 11, si hay error en los parámetros devolverá 12 y si ha habido errores al comprobar las contraseñas devolverá 13.
- Requisitos para desarrollar aplicación de consola C#.
- Caso de uso, comparar contraseña introducida por usuario y contraseña almacenada en WordPress.
- Aplicación de consola C# que compara la contraseña introducida con la almacenada en WordPress.
- Compilando y probando la aplicación de consola que compara contraseñas WordPress.
- Ejemplo de uso de la aplicación de consola en un formulario de login con Delphi.
- Descarga del código fuente de la aplicación C# completa que compara contraseñas WordPress.
Requisitos para desarrollar aplicación de consola C#
Utilizaremos Visual Studio .Net Community 2022, en el siguiente artículo explicamos cómo descargarlo e instalarlo:
Esta aplicación de consola no necesita conexión con la base de datos MySQL/MariaDB de WordPress, dado que sólo necesita que se le pasen ambas contraseñas por parámetro (argumento) al ejecutable. La aplicación externa que use esta herramienta sí necesitará este tipo de conexión a la BD de WordPress para obtener la contraseña cifrada del usuario.
La herramienta usará la librería CryptSharp.dll para el cifrado y comparación de contraseñas, por ello deberemos tener este fichero en la misma carpeta que el ejecutable. Dicho fichero se incluye en la descarga del código fuente de la aplicación.
Caso de uso, comparar contraseña introducida por usuario y contraseña almacenada en WordPress
Cuando tenemos un sitio web en WordPress y tenemos gestión de usuarios, WordPress almacena las contraseñas obteniendo el HASH MD5 y haciendo un pequeño «cifrado» adicional. Si queremos realizar una validación de usuarios externa a WordPress, desde una aplicación de escritorio por ejemplo, deberemos solicitar la contraseña al usuario, cifrarla con el mismo mecanismo que WordPress y compararla.
Supongamos que tenemos una aplicación en Delphi Community Edition que requiere de validación en la base de datos de usuarios de WordPress. En este caso podremos utilizar la herramienta de consola de C# para realizar esta validación.
La aplicación Delphi (o cualquier otra), en su formulario de login, ejecutará la aplicación de consola, pasándole como parámetro la contraseña introducida por el usuario y como segundo parámetro la contraseña de este usuario almacenada en al base de datos de WordPress.

La aplicación de consola comparará las contraseñas y devolverá 11 si son iguales. La aplicación Delphi obtendrá el ExitCode devuelto por la aplicación de consola, si es 11 continuará con el inicio correcto de la aplicación, en caso contrario indicará que la contraseña no es correcta.
Aplicación de consola C# que compara la contraseña introducida con la almacenada en WordPress
Abriremos Visual Studio Community y crearemos un nuevo proyecto de Aplicación de consola (.NET Framework):

Introduciremos un nombre para la solución, por ejemplo ProyectoAValidarLoginWordPress, una carpeta (ubicación) y la versión de .NET Framework mínima a aplicar, en este proyecto usaremos .NET Framework 2.0. Aunque es un Framework muy viejo, tiene la ventaja de que esta aplicación se podrá ejecutar en sistemas x32 y x64, por lo que la aplicación funcionará en equipos con Windows XP, Windows 7, Windows Vista, etc.:

Agregaremos la librería CryptSharp.dll a la carpeta bin\Debug del proyecto (donde residirá el ejecutable). Dicha librería esta disponible en la descarga de esta aplicación:

Agregaremos una referencia a esta librería en el proyecto, pulsando en el menú «Proyecto» – «Agregar referencia…»:

Pulsaremos en «Examinar»:

Seleccionaremos el fichero DLL CryptSharp.dll:

Aceptaremos los cambios para agregar la referencia a esta DLL:

Agregaremos el using correspondiente:
1 2 |
using CryptSharp; using System; |

Y agregaremos el siguiente código C#:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
using CryptSharp; using System; namespace ProyectoAValidarLoginWordPress { internal class Program { static void Main(string[] args) { //Leemos contraseña sin cifrar y contraseña cifrada WordPress en 2 parámetros //Devuelve: // -> 32 si las contraseñas coinciden // -> 11 si no coinciden // -> 12 si los parámetros son incorrectos // -> 13 si ha habido error al comprobar las contraseñas try { if (args.Length == 2) { string ContraPlana = args[0]; string contraCifrada = args[1]; if (PhpassCrypter.CheckPassword(ContraPlana, contraCifrada)) { //Para depuración Console.WriteLine("Las contraseñas coinciden..."); Console.ReadKey(); Environment.ExitCode = 32; } else { //Para depuración Console.WriteLine("Las contraseñas no coinciden..."); Console.ReadKey(); Environment.ExitCode = 11; } } else { //Para depuración Console.WriteLine("Error en los parámetros: parametro1 = contraseña plana, " + "parametro2=contraseña cifrada WordPress..."); Console.ReadKey(); //Código de salida 12 para aplicación de consola //Argumentos/Parámetros incorrectos Environment.ExitCode = 12; } } catch (Exception ex) { //Para depuración Console.WriteLine("Error en la comprobación de contraseñas: " + ex.Message); Console.ReadKey(); //Código de salida 13 para aplicación de consola //Error en la comprobación de contraseñas Environment.ExitCode = 13; } } } } |
Como se puede comprobar, el código obtiene dos parámetros (las dos contraseñas), el primer parámetro será la contraseña plana sin cifrar y el segundo parámetro la contraseña cifrada almacenada en WordPress. El código realizará la comparación entre ambas contraseñas (cifrando con el mismo método la contraseña plana). Devolverá un ExitCode:
- 32: las contraseñas plana (introducida en el formulario de login del usuario) y cifrada (en la BD de WordPress) coinciden.
- 11: las contraseñas no coinciden.
- 12: parámetros incorrectos, la aplicación requiere de parametro1 = contraseña plana, parametro2 = contraseña cifrada WordPress.
- 13: ha habido algún error al comprar las contraseñas.
Compilando y probando la aplicación de consola que compara contraseñas WordPress
Para probar este tipo de aplicaciones de consola que requieren de parámetros, desde Visual Studio .Net, pulsaremos en el menú «Depurar» – «Propiedades de depuración de ProyectoAValidadLoginWordPress»:

En «Argumentos de la línea de comandos» introduciremos los dos parámetros requeridos por la aplicación, entre comillas dobles y separados con un espacio, por ejemplo:
«micontraseñawp» «$BwdZk74lLY3vInb7sMwKwam.BuVov/2»

Ahora podremos compilar la aplicación, se le pasarán estos dos parámetros para verificar que funciona correctamente. La aplicación generará el cifrado de la contraseña «micontraseñawp» en modo WordPress y comparará si esta contraseña cifrada coincide con la «$BwdZk74lLY3vInb7sMwKwam.BuVov/2«. Si coincide devolverá un código de salida de 32, en caso contrario devolverá 11.

En caso de que la contraseña plana coincida con la cifrada WordPress, mostrará (en modo depuración):

Para depurar la aplicación, se ha dejado en el código fuente la opción de mostrar el resultado por consola y esperar la pulsación de una tecla para continuar. En producción quitaremos todas las líneas «Console.WriteLine» y «Console.ReadKey()«:
1 2 3 |
//Para depuración Console.WriteLine("Las contraseñas coinciden..."); Console.ReadKey(); |
Ejemplo de uso de la aplicación de consola en un formulario de login con Delphi
En una aplicación externa, por ejemplo desarrollada en Delphi, tendremos un formulario de este estilo (que solicitará usuario y contraseña de WordPress):

Cuando el usuario pulsa en «Iniciar sesión», la aplicación accederá a la base de datos WordPress, a la tabla wp_users. Filtrará el usuario introducido y obtendrá la contraseña de WordPress cifrada. Una vez obtenida, ejecutará la aplicación de consola anterior, con:
ProyectoAValidarLoginWordPress.exe «contraseña_formulario_login» «contraseña_obtenida_BD_WordPress»
Y capturará el valor devuelto por la aplicación de consola, si devuelve 32 las contraseñas coinciden y se continuará con el acceso a la aplicación. En caso contrario se mostrará un error indicando que la contraseña no es correcta.
El código fuente del formulario anterior completo en Delphi 6:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
unit UnidadInicioSesion; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, DB, shellapi; type TformInicioSesion = class(TForm) GroupBox1: TGroupBox; Label1: TLabel; txtUsuario: TEdit; txtContrasena: TEdit; Label2: TLabel; bIniciar: TBitBtn; bCancelar: TBitBtn; Label14: TLabel; Label3: TLabel; procedure bIniciarClick(Sender: TObject); procedure bCancelarClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCreate(Sender: TObject); procedure Label14Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var formInicioSesion: TformInicioSesion; continuar : boolean; implementation uses UnidadMD, UnidadProcedimientos, UnidadComunidadBikerMTB; {$R *.dfm} procedure TformInicioSesion.bIniciarClick(Sender: TObject); var contrasenaHash : string; resultado : integer; noAcceso : boolean; begin noAcceso := true; if (txtUsuario.Text <> '') and (txtContrasena.Text <> '') then begin //Conectamos con la BD de Comunidad Biker md.bd.Connected := false; md.bd.Connect; md.tc1.Close; md.tc1.SQL.Clear; md.tc1.SQL.Add('select ID, display_name, user_pass'); md.tc1.SQL.Add('from wp_users'); md.tc1.SQL.Add('where upper(user_login) = upper (:pUsuario)'); md.tc1.ParamByName('pUsuario').DataType := ftString; md.tc1.ParamByName('pUsuario').AsString := txtUsuario.Text; md.tc1.Open; if md.tc1.RecordCount = 1 then begin vtCodigoUsuario := md.tc1.fieldbyname('ID').AsInteger; vtNombreUsuario := md.tc1.fieldbyname('display_name').AsString; contrasenaHash := md.tc1.fieldbyname('user_pass').AsString; resultado := ejecutarEsperarResultado(IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) + 'ProyectoAValidarLoginWordPress.exe ' + txtContrasena.Text + ' ' + contrasenaHash, SW_NORMAL); //32 -> OK //11, 12, 13 -> Contraseña incorrecta o error if (resultado = 32) then begin continuar := true; if vtCodigoUsuario > 0 then Close; end end; end; if noAcceso then begin MessageDlg('La contraseña o usuario introducidos no son correctos.' + chr(13) + chr(13) + 'Asegúrese de estar registrado en Comunidad Biker MTB.', mtWarning, [mbok], 0); end; end; procedure TformInicioSesion.bCancelarClick(Sender: TObject); begin continuar := false; close; end; procedure TformInicioSesion.FormClose(Sender: TObject; var Action: TCloseAction); begin hide; if continuar then begin Application.CreateForm(TformMenuPrincipal, formMenuPrincipal); formMenuPrincipal.Caption := Application.Title + ' [' + vtNombreUsuario + ']'; formMenuPrincipal.ShowModal; end else Action := caFree; end; procedure TformInicioSesion.FormCreate(Sender: TObject); begin continuar := false; end; procedure TformInicioSesion.Label14Click(Sender: TObject); begin ShellExecute(Handle, Nil, PChar('http://www.comunidadbiker-mtb.com/wp-login.php?action=register'), Nil, Nil, SW_SHOWNORMAL); end; end. |
Esta aplicación tendrá un DataModule llamado md con los siguientes componentes para acceso a MySQL/MariaDB:
- TZQuery: llamado tc1 para ejecución de consultas SQL. Es el que usamos anteriormente para obtener la contraseña del usuario de WordPress de la tabla users.
- TZConnection: llamdo «bd» para la conexión con bases de datos MySQL, MariaDB, Oracle, SQLite, Sybase, Firebird, etc..

Descarga del código fuente de la aplicación C# completa que compara contraseñas WordPress
A continuación os dejamos el enlace a la descarga de la aplicación completa y el código fuente C#, desarrollada con Visual Studio .Net Community 2022, esta descarga incluye el fichero DLL Cryptsharp.dll: