Se solicita Programador Java

  • Autor Autor Angel Javier
  • Fecha de inicio Fecha de inicio
Estado

🔒 Este tema está cerrado para nuevas respuestas.

⏰ Solo el creador del tema puede solicitar la reapertura de sus propios temas, pero únicamente dentro de los 60 días previos a la última actualización.

Angel Javier

Angel Javier

Ómicron
Verificado
Verificación en dos pasos activada
Verificado por Binance
Precio
$1 USD
Formas de pago
  1. Saldo Forobeta
  2. Binance
  3. Paypal
  4. Otro
Método de entrega
Plazo para pagar
Máximo 1 día
Plazo de entrega
Máximo 1 día
Comisiones
No existen
Tengo una aplicación en Java, la cual estoy migrando a una plataforma web en Laravel (desarrollé todo desde 0).
Este es el aplicativo
1684875070036.webp

Es para dar de alta "usuarios" que se utilizan en otro sistema.

Lo que necesito es:
Saber exactamente como se está encriptando el campo pass (al guardar, se genera un archivo security.data el cual el campo queda encriptado) y un campo adicional que se llama signature (que no sé como se genera o de donde sale)

Necesito saber como se generan estas 2 variables, para recrearlo de alguna manera desde mi plataforma web en Laravel (no tienes que codear nada web, solo indicarme como se está encriptando estos 2 valores en el archivo generado).

Adjunto está la herramienta y un Java Decompiler por si lo quieres analizar

1684875251637.webp



Manda precio por MP
 

Adjuntos

¿Te sirvió? Únete a la conversación

Con tu cuenta gratis puedes responder, escribirle al autor por mensaje privado y comprar con Saldo retenido: el pago se libera cuando recibes lo acordado.

Toma 30 segundos · vuelves a este tema al terminar
En resumen, no tienes el código fuente del programa de escritorio.

En el descompilador el package que genera la contraseña está en com.ngpos.arch.util Digest.class


Java:
package com.ngpos.arch.util;

import com.ngpos.arch.util.types.FileHelper;
import com.ngpos.arch.util.utf.UTF8Converter;
import java.io.File;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;

public class Digest {
  public static void main(String[] paramArrayOfString) throws IOException {
    if (paramArrayOfString.length == 0) {
      generateByPlainFile();
    } else {
      String str = generateLine(paramArrayOfString);
      System.out.println(str);
    }
  }
 
  private static void generateByPlainFile() throws IOException {
    String str1 = "\\tmp\\security\\";
    String str2 = "security.data";
    File file = new File(str1 + "operators.txt");
    if (file.exists()) {
      (new File(str1 + str2)).delete();
      System.out.println("Generating security data file, based on '" + file.getAbsolutePath() + "'...\n");
      List list = FileHelper.readAsList(file);
      HashSet hashSet = new HashSet();
      byte b = 1;
      for (Iterator iterator = list.iterator(); iterator.hasNext(); ) {
        StringTokenizer stringTokenizer = new StringTokenizer(iterator.next(), ",");
        if (stringTokenizer.countTokens() == 3) {
          String str3 = (String)stringTokenizer.nextElement();
          String str4 = (String)stringTokenizer.nextElement();
          String str5 = ((String)stringTokenizer.nextElement()).trim();
          String str6 = (str4.length() >= 3) ? str4.substring(str4.length() - 3) : str4;
          if (hashSet.contains(str6)) {
            System.out.println("Line # " + b + " : Password '" + str6 + "' for user '" + str5 + "' alread exists !");
            System.exit(1);
          } else {
            hashSet.add(str6);
          }
          String str7 = generateLine(new String[] { str4, str5, str3, "99991231", str6 });
          FileHelper.append(str1 + str2, str7);
          System.out.println("Added: '" + str7 + "'");
        } else {
          System.out.println("Line # " + b + " : Invalid number of tokens !");
          System.exit(1);
        }
        b++;
      }
      System.out.println("\nAdded '" + list.size() + "' user(s) into the security.data file.");
    } else {
      System.out.println("Couldn't find source file '" + file.getAbsolutePath() + file.getName() + "'");
      System.exit(1);
    }
  }
 
  public static String generateLine(String[] paramArrayOfString) {
    if (paramArrayOfString.length != 5) {
      System.out.println("Usage: Digest [UserId UserName Level Expiration Passwd]");
      System.exit(0);
    }
    String str = generatePassword(UTF8Converter.stringToUTF8(paramArrayOfString[0]), UTF8Converter.stringToUTF8(paramArrayOfString[4]));
    StringBuffer stringBuffer = new StringBuffer();
    if (str != null) {
      stringBuffer.append(paramArrayOfString[0]);
      stringBuffer.append(",");
      stringBuffer.append(paramArrayOfString[1]);
      stringBuffer.append(",");
      stringBuffer.append(paramArrayOfString[2]);
      stringBuffer.append(",");
      stringBuffer.append(paramArrayOfString[3]);
      stringBuffer.append(",");
      stringBuffer.append(str);
      stringBuffer.append(",");
      stringBuffer.append(generateMD5(stringBuffer.toString()));
    }
    return stringBuffer.toString();
  }
 
  private static String generateMD5(String paramString) {
    String str;
    try {
      MessageDigest messageDigest = MessageDigest.getInstance("MD5");
      messageDigest.reset();
      messageDigest.update(UTF8Converter.stringToUTF8(paramString));
      byte[] arrayOfByte = messageDigest.digest();
      str = getOutput(arrayOfByte);
    } catch (NoSuchAlgorithmException noSuchAlgorithmException) {
      str = null;
    }
    return str;
  }
 
  private static String generatePassword(byte[] paramArrayOfbyte1, byte[] paramArrayOfbyte2) {
    String str;
    byte[] arrayOfByte1 = new byte[64];
    byte[] arrayOfByte2 = new byte[64];
    if (paramArrayOfbyte1.length == 0 || paramArrayOfbyte1.length > 64) {
      System.out.println("User Id should have length between 1 and 64 bytes");
      return null;
    }
    if (paramArrayOfbyte2.length < 1 || paramArrayOfbyte2.length > 16) {
      System.out.println("User password should have length between 1 and 16 bytes");
      return null;
    }
    byte b;
    for (b = 0; b < paramArrayOfbyte2.length; b++) {
      arrayOfByte1[b] = paramArrayOfbyte2[b];
      arrayOfByte2[b] = paramArrayOfbyte2[b];
    }
    for (b = 0; b < 64; b++) {
      arrayOfByte1[b] = (byte)(arrayOfByte1[b] ^ 0x36);
      arrayOfByte2[b] = (byte)(arrayOfByte2[b] ^ 0x5C);
    }
    try {
      MessageDigest messageDigest = MessageDigest.getInstance("MD5");
      messageDigest.reset();
      messageDigest.update(arrayOfByte1);
      messageDigest.update(paramArrayOfbyte1);
      byte[] arrayOfByte = messageDigest.digest();
      messageDigest.reset();
      messageDigest.update(arrayOfByte2);
      messageDigest.update(arrayOfByte);
      arrayOfByte = messageDigest.digest();
      str = getOutput(arrayOfByte);
    } catch (NoSuchAlgorithmException noSuchAlgorithmException) {
      str = null;
    }
    return str;
  }
 
  private static String getOutput(byte[] paramArrayOfbyte) {
    StringBuffer stringBuffer = new StringBuffer();
    for (byte b = 0; b < paramArrayOfbyte.length; b++)
      stringBuffer.append(Integer.toHexString(0xFF & paramArrayOfbyte[b]));
    return stringBuffer.toString();
  }
}
 
Última edición:
En resumen, no tienes el código fuente del programa de escritorio.

En el descompilador el package que genera la contraseña está en com.ngpos.arch.util Digest.class


Java:
package com.ngpos.arch.util;

import com.ngpos.arch.util.types.FileHelper;
import com.ngpos.arch.util.utf.UTF8Converter;
import java.io.File;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;

public class Digest {
  public static void main(String[] paramArrayOfString) throws IOException {
    if (paramArrayOfString.length == 0) {
      generateByPlainFile();
    } else {
      String str = generateLine(paramArrayOfString);
      System.out.println(str);
    }
  }
 
  private static void generateByPlainFile() throws IOException {
    String str1 = "\\tmp\\security\\";
    String str2 = "security.data";
    File file = new File(str1 + "operators.txt");
    if (file.exists()) {
      (new File(str1 + str2)).delete();
      System.out.println("Generating security data file, based on '" + file.getAbsolutePath() + "'...\n");
      List list = FileHelper.readAsList(file);
      HashSet hashSet = new HashSet();
      byte b = 1;
      for (Iterator iterator = list.iterator(); iterator.hasNext(); ) {
        StringTokenizer stringTokenizer = new StringTokenizer(iterator.next(), ",");
        if (stringTokenizer.countTokens() == 3) {
          String str3 = (String)stringTokenizer.nextElement();
          String str4 = (String)stringTokenizer.nextElement();
          String str5 = ((String)stringTokenizer.nextElement()).trim();
          String str6 = (str4.length() >= 3) ? str4.substring(str4.length() - 3) : str4;
          if (hashSet.contains(str6)) {
            System.out.println("Line # " + b + " : Password '" + str6 + "' for user '" + str5 + "' alread exists !");
            System.exit(1);
          } else {
            hashSet.add(str6);
          }
          String str7 = generateLine(new String[] { str4, str5, str3, "99991231", str6 });
          FileHelper.append(str1 + str2, str7);
          System.out.println("Added: '" + str7 + "'");
        } else {
          System.out.println("Line # " + b + " : Invalid number of tokens !");
          System.exit(1);
        }
        b++;
      }
      System.out.println("\nAdded '" + list.size() + "' user(s) into the security.data file.");
    } else {
      System.out.println("Couldn't find source file '" + file.getAbsolutePath() + file.getName() + "'");
      System.exit(1);
    }
  }
 
  public static String generateLine(String[] paramArrayOfString) {
    if (paramArrayOfString.length != 5) {
      System.out.println("Usage: Digest [UserId UserName Level Expiration Passwd]");
      System.exit(0);
    }
    String str = generatePassword(UTF8Converter.stringToUTF8(paramArrayOfString[0]), UTF8Converter.stringToUTF8(paramArrayOfString[4]));
    StringBuffer stringBuffer = new StringBuffer();
    if (str != null) {
      stringBuffer.append(paramArrayOfString[0]);
      stringBuffer.append(",");
      stringBuffer.append(paramArrayOfString[1]);
      stringBuffer.append(",");
      stringBuffer.append(paramArrayOfString[2]);
      stringBuffer.append(",");
      stringBuffer.append(paramArrayOfString[3]);
      stringBuffer.append(",");
      stringBuffer.append(str);
      stringBuffer.append(",");
      stringBuffer.append(generateMD5(stringBuffer.toString()));
    }
    return stringBuffer.toString();
  }
 
  private static String generateMD5(String paramString) {
    String str;
    try {
      MessageDigest messageDigest = MessageDigest.getInstance("MD5");
      messageDigest.reset();
      messageDigest.update(UTF8Converter.stringToUTF8(paramString));
      byte[] arrayOfByte = messageDigest.digest();
      str = getOutput(arrayOfByte);
    } catch (NoSuchAlgorithmException noSuchAlgorithmException) {
      str = null;
    }
    return str;
  }
 
  private static String generatePassword(byte[] paramArrayOfbyte1, byte[] paramArrayOfbyte2) {
    String str;
    byte[] arrayOfByte1 = new byte[64];
    byte[] arrayOfByte2 = new byte[64];
    if (paramArrayOfbyte1.length == 0 || paramArrayOfbyte1.length > 64) {
      System.out.println("User Id should have length between 1 and 64 bytes");
      return null;
    }
    if (paramArrayOfbyte2.length < 1 || paramArrayOfbyte2.length > 16) {
      System.out.println("User password should have length between 1 and 16 bytes");
      return null;
    }
    byte b;
    for (b = 0; b < paramArrayOfbyte2.length; b++) {
      arrayOfByte1[b] = paramArrayOfbyte2[b];
      arrayOfByte2[b] = paramArrayOfbyte2[b];
    }
    for (b = 0; b < 64; b++) {
      arrayOfByte1[b] = (byte)(arrayOfByte1[b] ^ 0x36);
      arrayOfByte2[b] = (byte)(arrayOfByte2[b] ^ 0x5C);
    }
    try {
      MessageDigest messageDigest = MessageDigest.getInstance("MD5");
      messageDigest.reset();
      messageDigest.update(arrayOfByte1);
      messageDigest.update(paramArrayOfbyte1);
      byte[] arrayOfByte = messageDigest.digest();
      messageDigest.reset();
      messageDigest.update(arrayOfByte2);
      messageDigest.update(arrayOfByte);
      arrayOfByte = messageDigest.digest();
      str = getOutput(arrayOfByte);
    } catch (NoSuchAlgorithmException noSuchAlgorithmException) {
      str = null;
    }
    return str;
  }
 
  private static String getOutput(byte[] paramArrayOfbyte) {
    StringBuffer stringBuffer = new StringBuffer();
    for (byte b = 0; b < paramArrayOfbyte.length; b++)
      stringBuffer.append(Integer.toHexString(0xFF & paramArrayOfbyte[b]));
    return stringBuffer.toString();
  }
}


PD: MD5 ya no se usa por la vulnerabilidad a colisiones.
 
PD: MD5 ya no se usa por la vulnerabilidad a colisiones.
Es un sistema que no se utiliza en internet, ya tenía esa clase aparte, pero se juntan varios parámetros para generar el password y el signature, que no encuentro cuales son
 
Estado

🔒 Este tema está cerrado para nuevas respuestas.

⏰ Solo el creador del tema puede solicitar la reapertura de sus propios temas, pero únicamente dentro de los 60 días previos a la última actualización.

Temas similares

R
  • Cerrado
Se solicita Programador java
Respuestas
6
Visitas
113
OnlineMundial
OnlineMundial
R
  • Cerrado
Se solicita Programador java
Respuestas
5
Visitas
113
eldon309
eldon309
lusky2099
Respuestas
2
Visitas
107
eldon309
eldon309
R
  • Cerrado
Se solicita Programador java
Respuestas
1
Visitas
80
JeoReyes
JeoReyes
Atrás
Arriba