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 Whatsapp
¡Ha verificado su Paypal!
Verificado por Binance
Retroalimentación: +178 / =0 / -1
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

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.

Atrás
Arriba