|
MD5Visão geral do algoritmo MD5A função é para uma informação(mensagem)Gerar resumos de informações(resumo da mensagem), o resumo é único para a informação,Pode ser usado como assinatura digital. Usado para verificar a validade do documento(Se há dados perdidos ou corrompidos),A criptografia da senha do usuário, o valor do hash é calculado na função hash. Insira uma cadeia de bytes de qualquer comprimento para gerar uma128O inteiro do bit. Devido a algumas características irreversíveis do algoritmo, ele possui boa segurança em aplicações de criptografia. eMD5O uso de algoritmos não exige o pagamento de taxas de direitos autorais. Nem a unicidade nem a irreversibilidade são absolutas, analisando-as teoricamente como uma relação muitos-para-um, mas a probabilidade de duas informações diferentes produzirem o mesmo resumo é pequena. Irreversível significa que a quantidade de computação e tempo de computação necessária para deduzir a entrada da saída é grande demais, e o método de busca por dicionários exige muito espaço de armazenamento. TeiaSistemaIdeias de design Este sistema é baseado no Java Web, e com a ajuda destrut2para alcançar isso. A ideia básica do design é passarWebpágina para calcular um arquivo na memória externa do sistema duas vezesMD5valor, e comparar, se for o mesmo, o arquivo não foi adulterado; se for diferente, significa que o arquivo foi adulterado. TeiaArquivo de versão ideias detalhadas de design do sistema à prova de adulteração: aprovadoJSPRecupere um arquivo que precisa ser calculado na memória externa do sistema.JSPApós submeter, passestrut2deAçãoPular para com valoresJavacamada lógica. na camada lógicaAçãoChamada médiadaométodos,daoO cálculo é encapsuladoMD5valor.DaoMétodoJSPDocumentos que chegam e calculadorasMD5Após a conclusão do cálculo, retorne o caminho original do valorAçãoEsta é a primeira vez que um arquivo é calculadoMD5Valor, Salve emSessão, para que possa ser comparado com o segundoMD5Valores. Após a primeira execução bem-sucedida, pule paraSucessopágina. Agora comece a segunda vez no arquivoMD5Cálculo, também pelo método acima. Após o cálculoMD5Após o valor, o segundo tempo é calculadoMD5O valor é o mesmo do primeiro calculado e é salvo emSessãoSe os valores forem os mesmos, não há mudança. Se for diferente, significa que foi adulterado. Implementação do sistema Passo 1,Index.jspCódigo-fonte em <!-- Index.jspAdicione arquivos do armazenamento do sistema aqui--> <center> <form action="fileCrypt" método = get"> <table> <tr> <td>Nome do arquivo:</td> <td><tipo de entrada="nome do arquivo"Md5FilesEntity.nomefile" /> </td> <td><input type="submit" value="start" /> </td> </tr> </table> </form> </center> Passo 2,SuportesO código-fonte no arquivo de configuração <!-- suportes2Arquivos de configuração--> <struts> <valor constante="verdadeiro" nome="struts.devMode" /> <valor constante="zh_CN" nome="struts.locale" /> <valor constante="utf-8" nome="struts.i18n.encoding" /> <nome do pacote="padrão" estende="struts-default"> <nome da ação="mdeAção" class="com.crypt.action.mdeAção" metodologia="codeCrype"> <nome do resultado="sucesso">/index.jsp</result> </action> <nome da ação="fileCrypt" class="com.crypt.action.FilesCryptAction"> <nome do resultado="sucesso">/success.jsp</result> </action> <nome da ação="fileCrypt2" class="com.crypt.action.FilesCryptAction" método ="SetCrypt2"> <nome do resultado="sucesso">/FilnallySuccess.jsp</result> <nome do resultado="fail">/fail.jsp</result> </action> </struts> O terceiro passo é pular para o FilesCryptAction após o struts2 pacote com.crypt.action; importar java.io.IOException; import javax.servlet.http.Http.HttpServletRequest; importar javax.servlet.http.HttpHttpSession; import org.apache.struts2.ServletActionContext; importação com.crypt.dao.Md5_dao; importar com.opensymphony.xwork2.ActionSupport; importar com.crypt.entity.Md5FilesEntity; a classe pública FilesCryptAction estende o ActionSupport { privado Md5FilesEntityM Md5FilesEntity = novo Md5FilesEntity(); HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = request.getSession(); public Md5FilesEntity getMd5FilesEntity() { return Md5FilesEntity; } public void setMd5FilesEntity(Md5FilesEntity md5FilesEntity) { Md5FilesEntity = md5FilesEntity; } o public String execute() lança IOException { String fileCode = null; try { fileCode = Md5_dao.getFileCode("e:" + Md5FilesEntity.getFilename()); session.setAttribute("fileCode", fileCode); //A primeira vez que foi calculadoMD5O valor é temporário salvo emSessãoMédia } captura (Exceção e) { TODO Bloco de captura gerado automaticamente e.printStackTrace(); } Md5FilesEntity.setFileAfterHashCode1(fileCode); retorno "sucesso"; } public String SetCrypt2() { String fileCode2 = null; try { fileCode2 = Md5_dao .getFileCode("e:" + Md5FilesEntity.getFilename()); } captura (Exceção e) { TODO Bloco de captura gerado automaticamente e.printStackTrace(); } Md5FilesEntity.setFileAfterHashCode2(fileCode2); System.out.println("session1"+session.getAttribute("fileCode")); if (fileCode2 .equals(session.getAttribute("fileCode"))) { retorno "sucesso"; } else { devolver "fail"; } } } No quarto passo, a ação começa a saltar para a Md5_dao com valores pacote com.crypt.dao; importação com.crypt.md5.Md5Crypt_1; importação com.crypt.md5.Md5Crypt_2; classe pública Md5_dao { String estático público getFileCode(String fileName) lança Exception { System.out.println(nomedo do arquivo); String hashCode = Md5Crypt_1.getHash(nomeArquivo, "MD5"); System.out.println(hashCode); retorne hashCode; } } O quinto passo é criar uma API no sistema para calcular o valor MD5 de um arquivo, então chame-o diretamente no DAO, e agora ele é processado diretamente no método Md5Crypt_1 pacote com.crypt.md5; importação java.io.*; importar java.security.*; classe pública Md5Crypt_1 { caráter estático público[] hexChar = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; public static void main(String[] args) throws Exception { String fileName = "e:/111.txt"; String hashType = "MD5"; System.out.println(hashType + " == " + getHash(fileName, hashType)); } String estática pública getHash(Nome do arquivo String, Tipo de hash de string) throws Exception { InputStream fis; fis = novo FileInputStream(fileName); Buffer de byte[] = novo byte[1024]; MessageDigest md5 = MessageDigest.getInstance(hashType); int numRead = 0; enquanto ((numRead = fis.read(buffer)) > 0) { md5.update (buffer, 0, numRead); } fis.close(); retorne para HexString(md5.digest()); } Public static String toHexString(byte[] b) { StringBuilder sb = novo StringBuilder(b.length * 2); //Construa um gerador de string e inicialize no conteúdo especificado da string para (int i = 0; Eu < B.Length; i++) { sb.append(hexChar[(b& 0xf0) >>> 4]); AnexarOs métodos sempre adicionam esses caracteres ao final do gerador sb.append(hexChar[b& 0x0f]); } return sb.toString(); } } Passo 6: Após calcular com sucesso o valor de MD5 do arquivo, o primeiro MD5 é armazenado na sessão em ação e, através da configuração do arquivo de configuração struts2, pula para o seccess.jsp, exibe o valor MD5 calculado pela primeira vez e solicita iniciar o segundo cálculo: Código-fonte em Success.jsp: <body> A primeira vez que foi calculadoMD5O valor é: <s:iterator value="Md5FilesEntity" id="Md5FilesEntity" status="L"> <s:property value="#Md5FilesEntity.fileAfterHashCode1" /> </s:iterador> <center> <form action="fileCrypt2" método="get"> <table> <tr> <td>Nome do arquivo:</td> <td><tipo de entrada="nome do arquivo"Md5FilesEntity.nomefile" /> </td> <td><input type="submit" value="start" /> </td> </tr> </table> </form> <form> <textarea style="text-align: left; " rows="10" cols="41" readonly="readonly"> <s:iterator value="Md5FilesEntity" id="Md5FilesEntity" status="L"> <s:property value="#Md5FilesEntity.Md5FileCode" /> </s:iterador> </textarea> </form> </center> </body> Passo 7: Comece a segunda submissão e calculeMD5O valor é calculado novamente após o cálculo novamente, de acordo com o processo acimaMD5O valor é comparado com o valor da primeira vez, se for duas vezesMD5 Se for a mesma coisa, significa que não há adulteração; Se duas vezesMD5Se o valor for diferente, o documento foi adulterado. Assim, todo o sistema é concluído. Teste de sistemas à prova de adulteração de documentos Coloque o sistema no suporteTomAct 6.0Venha e percebaWebCorra. Abaixo está um diagrama de teste do sistema: Passo 1: Adicione os arquivos que precisam ser calculados. E reprimir"Início" para começar a calcular.
O segundo passo é calculadoMD5, emsuccess.jspmostra o primeiro calculadoMD5valor e exibição. Um segundo cálculo também é solicitado para determinar se foi adulterado.
O terceiro passo é realizar um segundo cálculo sem adulterar o documentoMD5valor. Se não houver adulteração, a página sem o salto será saltada diretamente e o "arquivo não foi adulterado" será exibido. Se foi adulterado, mostrará que o documento foi adulterado.
Passo 4: Faça alterações no arquivo e repita o teste acima Primeiro cálculo:
Após o cálculo ser bem-sucedido:
O quinto passo é manipular deliberadamente o documento e calculá-lo. Em princípio, o documento é adulterado e calculado duas vezesMD5Não, ao comparar, você deve ser informado de que o arquivo foi adulterado.
Neste ponto, os testes de todo o sistema são concluídos.
|