Como decifrar a senha a partir da senha cifrada

actualmente estamos a cifrar as senhas introduzidas pelo utilizador a partir da página de autenticação e armazená-las na Base de dados. Aqui estou desenvolvendo uma nova página de login para fins internos e reutilizando o mesmo nome de usuário e senha criptografada. Se o utilizador estiver autorizado, permitir-lhe-á aceder aos relatórios. Aqui minha pergunta é, Como posso obter a chave secreta que eles usaram para criptografar. Gostaria de usar a mesma chave para descriptografar a senha e eu posso ir em frente com a minha logico.

Este é o código que estamos a usar para encriptar o método para encriptar a senha.

user = userRemote.loginUser(userName, new String(EncryptDecrypt.storePassword(password),"Cp1252"));

Here password is Password entered in the login page.

Este é o método para encriptar a senha.

final static byte[] salt = {
        (byte)0xc7, (byte)0x73, (byte)0x21, (byte)0x8c,
        (byte)0x7e, (byte)0xc8, (byte)0xee, (byte)0x99
    };
final static int count = 1;

public static byte[] storePassword(char[] password) throws InternalException {
      PBEKeySpec pbeKeySpec;
      PBEParameterSpec pbeParamSpec;
      SecretKeyFactory keyFac;
      byte[] ciphertext = null;
      try {
        // Install SunJCE provider
        Provider sunJce = new com.sun.crypto.provider.SunJCE();
        Security.addProvider(sunJce);

        // Create PBE parameter set
        pbeParamSpec = new PBEParameterSpec(salt, count);

        pbeKeySpec = new PBEKeySpec(password);
        keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
        SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec);
        // Create PBE Cipher
        Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");

        // Initialize PBE Cipher with key and parameters
        pbeCipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec);

        // Our cleartext
        byte[] cleartext = (new String(password)).getBytes("Cp1252");

        // Encrypt the cleartext
        ciphertext = pbeCipher.doFinal(cleartext);
      } catch (BadPaddingException ex) {
        log.error("EncryptDecrypt: " + ex.getMessage());
        throw new InternalException(ex.getMessage());
      } catch (Exception ex) {
        log.error("EncryptDecrypt: " + ex.getMessage());
        throw new InternalException(ex.getMessage());
      }
     return ciphertext;
  }

esta é a classe que está a usar para descodificar a senha. Aqui eu só tenho senha criptografada como uma entrada para descriptografar a senha. For example * Ä0BÒ / O, so am using the same to generate secret key and decrypt it. Mas, ficar abaixo da excepção. hipoteca.seguranca.especificacao.Invalidkeyspection: a senha não é ASCII

import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;

public class DecryptPassword {

    public static void main(String[] args) {
        String decryptedStr = checkPassword("•Ä0BÒ¦O");
        System.out.println("decryptedStr : "+decryptedStr);
    }

    final static byte[] salt = {
        (byte)0xc7, (byte)0x73, (byte)0x21, (byte)0x8c,
        (byte)0x7e, (byte)0xc8, (byte)0xee, (byte)0x99
    };

    final static int count = 1;

    static String decryptedPassword = "";

     public static String checkPassword(String encryptedPassword) {
          PBEKeySpec pbeKeySpec;
          PBEParameterSpec pbeParamSpec;
          SecretKeyFactory keyFac;
          try {
            // Install SunJCE provider
            Provider sunJce = new com.sun.crypto.provider.SunJCE();
            Security.addProvider(sunJce);
            // Create PBE parameter set
            pbeParamSpec = new PBEParameterSpec(salt, count);
            pbeKeySpec = new PBEKeySpec(encryptedPassword.toCharArray());
            keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
            SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec);
            // Create PBE Cipher
            Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
            // Initialize PBE Cipher with key and parameters
            pbeCipher.init(Cipher.DECRYPT_MODE, pbeKey, pbeParamSpec);
            byte[] decrypted = pbeCipher.doFinal(encryptedPassword.getBytes());
            decryptedPassword = decrypted.toString();
        } catch (BadPaddingException ex) {
          System.out.println("EncryptDecrypt: " + ex.getMessage());
        } catch (Exception ex) {
          System.out.println("EncryptDecrypt: " + ex.getMessage());
        }
        return decryptedPassword;
      }

}
Aqui Vou Eu. deve ser capaz de decifrar a senha com sucesso, mas não.Alguém me pode ajudar com o que falta aqui? Obrigado Antecipadamente.

Author: Honey, 2019-04-22

1 answers

Isso não é encriptação, é um haxixe! (tiro na jante)

Que storePassword a rotina usa efectivamente a senha para encriptar-se; mais exactamente, PBEwithMD5andDES usa uma chave derivada da senha pela função de derivação pkcs5v1 original, agora retronimada PBKDF1 para maior clareza, instanciada com MD5, sal fixo, e 1 (!) iteração, para criptografar com o DES CBC original a senha. Esta é uma variação de uma forma anteriormente popular de criar um hash criptográfico.

Durante os anos 60 e a década de 1970, e talvez da década de 1980, antes estudando criptografia voltaram sua atenção para a concepção específica de funções de hash criptográficas para cifras foram a única criptografia primitivo, um método comum de transformar uma cifra (um introduzidos permutação) em uma criptografia hash (uma unkeyed função) foi utilizar os dados como chave para criptografar uma constante; uma pequena variação de isto foi implementado como uma biblioteca de função incorretamente chamado crypt e usado como a palavra-passe função hash no início de Unix ca de 1970, e é ainda lembrados (algumas vezes até usados), mas agora muitas vezes retronimados DES-crypt ou descrypt para distinguir das alternativas e substituições desenvolvidas desde então.

Ao contrário de uma cifra que foi desenhada para ser decifrada, esta é uma hash e desenhada para não ser revertida. Não sei de nenhuma maneira de reverter este método mais fácil do que a força bruta (isto é, uma 'quebra' analítica), mas o DES original, agora geralmente chamado de single-DES (ou 1DES) para distinguir de seu sucessor direto triple-DES( ou 3DES ou formalmente TDEA), é fraco o suficiente, pode agora ser forçado, se realmente quiseres. Por exemplo o JTR relata aproximadamente 10m-30M de ensaios/seg para descriptografia de sal único, o que corresponderia a cerca de 0,5 G/seg para DES simples, então tentar todas as teclas DES levaria vários anos com um computador, alguns dias com mil computadores, ou alguns minutos com um milhão de computadores. Os dados sobre o hashcat são mais difíceis de encontrar, mas parecem aproximadamente comparáveis. Se você tiver alguma pista de como a senha foi escolhida, pode ser mais rápido tentar apenas as possíveis senhas em vez de todas as chaves possíveis.

Mas não o faças. a forma correcta de verificar uma senha hash é que o utilizador forneça a senha pedida, repita o processo de hash com os mesmos parâmetros (aqui é fácil porque não usa um sal variável como deveria) e veja se o novo resultado hash corresponde ao armazenado.

 2
Author: dave_thompson_085, 2019-04-22 08:45:11