Criptografia [java] Um estudo preliminar de assinaturas digitais em métodos de criptografia

prefácio

  • A parte sobre o uso de keytool não foi realizada, então registre-a primeiro! !

1 Introdução à Assinatura Digital

  • Uma assinatura digital (também conhecida como assinatura digital de chave pública) é uma string digital que só pode ser gerada pelo remetente da mensagem e não pode ser falsificada por terceiros. Essa string digital também é uma prova efetiva da autenticidade da mensagem enviada pelo remetente da mensagem.
  • É um método de autenticação de informações digitais semelhante a uma assinatura física comum escrita em papel, mas implementado usando técnicas do campo da criptografia de chave pública.
  • Um conjunto de assinaturas digitais costuma definir duas operações complementares, uma de assinatura e outra de verificação.
  • A assinatura digital é a aplicação da tecnologia de criptografia de chave assimétrica e da tecnologia abstrata digital.

  • O significado da assinatura digital é: quando os dados são transmitidos na rede, uma assinatura digital é adicionada aos dados para indicar quem os enviou e também pode provar que os dados não foram adulterados.

2 Princípios básicos

Diz-se que Zhang San tem dois bons amigos A e B. Devido a motivos de trabalho, Zhang San, A e B precisam criptografar por segurança ao escrever e-mails. Então Zhang San pensou em assinaturas digitais:

  • Passo 1: Criptografia usa criptografia assimétrica Zhang San tem três chaves e duas chaves públicas, que ele dá a seus amigos. Mantenha uma chave privada para você.
  • Etapa 2: A ou B escreve um e-mail para Zhang San: A primeiro criptografa o e-mail com a chave pública e, em seguida, Zhang San usa a chave privada para descriptografar o e-mail após recebê-lo.
  • Etapa 3: Zhang San escreve um e-mail para A ou B:
    1. Depois que Zhang San terminou de escrever o e-mail, ele primeiro usou a função hash para gerar um resumo do e-mail e o anexou ao artigo, que completou a assinatura digital e, em seguida, Zhang San o criptografou com a chave privada para enviar o e-mail.
    2. Depois que A ou B receber o e-mail, primeiro remova a assinatura digital e use sua própria chave pública para descriptografá-la. Neste momento, se o resumo na assinatura digital retirada for consistente com o de Zhang San, então é considerado enviado por Zhang San e, em seguida, use a função Hash na própria carta e compare o resultado com o resumo obtido em o passo anterior. Se os dois coincidirem, isso prova que a letra não foi alterada.
      insira a descrição da imagem aqui

insira a descrição da imagem aqui

3 certificados digitais

insira a descrição da imagem aqui

  • A chave pública é necessária para verificar a assinatura. Se a chave pública for forjada, não podemos verificar a assinatura digital e é impossível determinar a legitimidade da outra parte a partir da assinatura digital. É aqui que entra o certificado. Todos nós podemos ter a experiência de obter vários certificados, como certificados Putonghua, certificados CET-4 e CET-6, etc., mas, em última análise, podemos mostrar nossos certificados em qualquer ocasião para provar que realmente passamos no teste de Putonghua e passou no teste. Nível quatro ou seis. O mesmo vale para os certificados aqui.
  • Geração de certificado
    insira a descrição da imagem aqui

4 Criptografia de página da Web

Um exemplo de aplicação de "certificado digital": protocolo https. Este protocolo é usado principalmente para criptografia da web

  • Primeiro, o cliente faz uma solicitação criptografada ao servidor.
    insira a descrição da imagem aqui
  • Depois que o servidor criptografa a página da Web com sua própria chave privada, ele a envia ao cliente junto com seu próprio certificado digital.
    insira a descrição da imagem aqui
  • O "Gerenciador de certificados" do cliente (navegador) possui uma lista de "Autoridades de certificação raiz confiáveis". O cliente irá verificar se a chave pública para desbloquear o certificado digital está na lista conforme esta lista.
  • Se a URL registrada no certificado digital estiver inconsistente com a URL que você está navegando, significa que esse certificado pode ser utilizado de forma fraudulenta, e o navegador emitirá um aviso.
    insira a descrição da imagem aqui

5 ícones de conexão de site de borda

  • Ao navegar na web no Microsoft Edge, um ícone aparece na barra de endereço indicando o nível de segurança da conexão com o site que você deseja visitar. Este ícone ajuda a determinar se é seguro enviar e receber informações de um site. A conexão informa se as informações enviadas de e para o site, como senhas, endereços ou cartões de crédito, são enviadas com segurança e não podem ser interceptadas por um invasor. A conexão não informa a reputação do site. No entanto, se o endereço for um site conhecido de phishing ou malware, o Microsoft Defender SmartScreen identificará e indicará esse endereço.
  • O ícone de conexão na barra de endereço tem quatro estados diferentes. As informações a seguir explicam o que cada status significa e fornecem dicas sobre como tomar decisões inteligentes para sua navegação:
    • Conexão segura (certificado válido)
      insira a descrição da imagem aqui
    • sem segurança total (certificado certificado)
      insira a descrição da imagem aqui
    • Configuração de segurança expirada (inválida, expirada, autoassinada)
      insira a descrição da imagem aqui
    • Sites suspeitos ou perigosos (phishing ou malware)
      insira a descrição da imagem aqui

6 implementação de código

package com.atguigu.Signature;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.nio.charset.Charset;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

public class SignatureDemo {
    
    
    public static void main(String[] args) throws Exception {
    
    
        String a = "123";

        PublicKey publicKey = getPublicKey( "a.pub","RSA");
        PrivateKey privateKey = getPrivateKey("a.pri","RSA");

        String signaturedData = getSignature(a, "sha256withrsa", privateKey);

        boolean b = verifySignature(a, "sha256withrsa", publicKey, signaturedData);
        System.out.println(b);

    }

    /**
     * 读取公钥
     * @param publicPath 公钥路径
     * @param algorithm  算法
     * @return
     */
    public static PublicKey getPublicKey(String publicPath, String algorithm) throws Exception{
    
    
        String publicKeyString = FileUtils.readFileToString(new File(publicPath), Charset.defaultCharset());
        // 创建key的工厂
        KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
        // 创建公钥规则
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyString));
        return keyFactory.generatePublic(keySpec);
    }

    /**
     *  读取私钥
     * @param priPath 私钥的路径
     * @param algorithm 算法
     * @return 返回私钥的key对象
     */
    public static PrivateKey getPrivateKey(String priPath, String algorithm) throws Exception{
    
    
        String privateKeyString = FileUtils.readFileToString(new File(priPath), Charset.defaultCharset());
        // 创建key的工厂
        KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
        // 创建私钥key的规则
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyString));
        // 返回私钥对象
        return keyFactory.generatePrivate(keySpec);
    }

    /**
     * 生成签名
     *
     * @param input      : 原文
     * @param algorithm  : 算法
     * @param privateKey : 私钥
     * @return : 签名
     * @throws Exception
     */
    private static String getSignature(String input, String algorithm, PrivateKey privateKey) throws Exception {
    
    
        // 获取签名对象
        Signature signature = Signature.getInstance(algorithm);
        // 初始化签名
        signature.initSign(privateKey);
        // 传入原文
        signature.update(input.getBytes());
        // 开始签名
        byte[] sign = signature.sign();
        // 对签名数据进行Base64编码
        return Base64.encodeBase64String(sign);
    }

    /**
     * 校验签名
     *
     * @param input          : 原文
     * @param algorithm      : 算法
     * @param publicKey      : 公钥
     * @param signaturedData : 签名
     * @return : 数据是否被篡改
     * @throws Exception
     */
    private static boolean verifySignature(String input, String algorithm, PublicKey publicKey, String signaturedData) throws Exception {
    
    
        // 获取签名对象
        Signature signature = Signature.getInstance(algorithm);
        // 初始化签名
        signature.initVerify(publicKey);
        // 传入原文
        signature.update(input.getBytes());
        // 校验数据
        return signature.verify(Base64.decodeBase64(signaturedData));
    }
}

7 uso da ferramenta keytool

  • caminho da ferramenta keytool:C:\Program Files\Java\jdk-19\bin
    insira a descrição da imagem aqui

7.1 Comandos comuns:

  1. Gerar par de chaves
    keytool -genkeypair
    keytool -genkeypair -alias lisi(后面部分是为证书指定别名,否则采用默认的名称为mykey)
    
  2. Veja os itens no keystore:
    keytool -list或keytool -list -v
    keytool -exportcert -alias lisi -file lisi.cer
    
  3. Gere um certificado imprimível:
    keytool -exportcert -alias lisi -file lisi.cer –rfc
    
  4. Exibir informações de certificado em um arquivo de certificado digital:
    keytool -printcert -file lisi.cer
    
    • Clique duas vezes em lisi.cer diretamente para abrir lisi.cer com o programa integrado do sistema de janelas

7.2 Gerar chave privada e chave pública [sem sucesso na prática]

  1. Gerar um certificado de chave O seguinte comando gera um certificado de chave, usando o algoritmo RSA, cada certificado contém uma chave pública e uma chave privada
keytool -genkeypair -alias guigu -keyalg RSA -keypass guigugu -keystore guigu.jks -storepass guigugu
  • Keytool é uma ferramenta de gerenciamento de certificados fornecida por java

    -alias:密钥的别名 
    -keyalg:使用的hash算法 
    -keypass:密钥的访问密码 
    -keystore:密钥库文件名,xc.keystore保存了生成的证书 
    -storepass:密钥库的访问密码 
    
  1. Consultar informações do certificado
    keytool -list -keystore guigu.jks
    
  2. excluir apelido
    keytool -delete -alias guigu -keystore guigu.jsk
    

7.3 Exportar chave pública

  • O openssl é um kit de ferramentas de criptografia e descriptografia. O Openssl é usado aqui para exportar informações de chave pública.
  • instalar openssl
  1. Instale Win64OpenSSL-1_1_0g.exe no diretório de dados, configure a variável de ambiente path do openssl, conforme mostrado abaixo:
    insira a descrição da imagem aqui
  • Cmd entra no diretório onde o arquivo guigu.jks está localizado e executa o seguinte comando (o seguinte comando é executado no windows, ele mudará - para chinês, por favor, mude para inglês -):
keytool -list -rfc --keystore guigu.jks | openssl x509 -inform pem -pubkey
  • O parágrafo seguinte é a chave pública
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvFsEiaLvij9C1Mz+oyAm
t47whAaRkRu/8kePM+X8760UGU0RMwGti6Z9y3LQ0RvK6I0brXmbGB/RsN38PVnh
cP8ZfxGUH26kX0RK+tlrxcrG+HkPYOH4XPAL8Q1lu1n9x3tLcIPxq8ZZtuIyKYEm
oLKyMsvTviG5flTpDprT25unWgE4md1kthRWXOnfWHATVY7Y/r4obiOL1mS5bEa/
iNKotQNnvIAKtjBM4RlIDWMa6dmz+lHtLtqDD2LF1qwoiSIHI75LQZ/CNYaHCfZS
xtOydpNKq8eb1/PGiLNolD4La2zf0/1dlcr5mkesV570NxRmU1tFm8Zd3MZlZmyv
9QIDAQAB
-----END PUBLIC KEY-----
  • Copie a chave pública acima no arquivo de texto public.key, mescle-a em uma linha e coloque-a no projeto que precisa implementar a autenticação de autorização.

Acho que você gosta

Origin blog.csdn.net/yang2330648064/article/details/130537200
Recomendado
Clasificación