Diretório de artigos
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:
- 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.
- 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.
3 certificados digitais
- 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
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.
- 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.
- 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.
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)
- sem segurança total (certificado certificado)
- Configuração de segurança expirada (inválida, expirada, autoassinada)
- Sites suspeitos ou perigosos (phishing ou malware)
- Conexão segura (certificado válido)
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
7.1 Comandos comuns:
- Gerar par de chaves
keytool -genkeypair keytool -genkeypair -alias lisi(后面部分是为证书指定别名,否则采用默认的名称为mykey)
- Veja os itens no keystore:
keytool -list或keytool -list -v keytool -exportcert -alias lisi -file lisi.cer
- Gere um certificado imprimível:
keytool -exportcert -alias lisi -file lisi.cer –rfc
- 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]
- 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:密钥库的访问密码
- Consultar informações do certificado
keytool -list -keystore guigu.jks
- 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
- Instale Win64OpenSSL-1_1_0g.exe no diretório de dados, configure a variável de ambiente path do openssl, conforme mostrado abaixo:
- 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.