apoio Rijndael em Java
-
06-09-2019 - |
Pergunta
Temos a obrigação de fazer algum desenvolvimento Rijndael em Java.
Quaisquer recomendações para artigos, bibliotecas etc. que nos ajudaria?
Os ponteiros para a manutenção de armazenamento de chaves e como armazenar as chaves de forma segura?
Editar:
Ele teria de ser open source. Essencialmente, é apenas padrão criptografar / descriptografar dados usando Rijndael.
Solução
Java inclui AES fora da caixa. Rijndael é AES. Você não precisa de quaisquer bibliotecas externas. Você só precisa de algo como isto:
byte[] sessionKey = null; //Where you get this from is beyond the scope of this post
byte[] iv = null ; //Ditto
byte[] plaintext = null; //Whatever you want to encrypt/decrypt
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
//You can use ENCRYPT_MODE or DECRYPT_MODE
cipher.calling init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv));
byte[] ciphertext = cipher.doFinal(plaintext);
E é isso, para encriptação / desencriptação. Se você está processando grandes quantidades de dados, então é melhor você ler pedaços que são múltiplos de 16 bytes e chamando update em vez de doFinal (você apenas chamar doFinal no último bloco).
Outras dicas
Para uma grande biblioteca livre, eu recomendo BouncyCastle. Ele é mantido ativamente, de alta qualidade, e tem uma matriz agradável de exemplos de código. Para obter a documentação de referência, você vai ter que confiar mais no geral docs JCE.
Eu não posso dizer o uso que biblioteca para atender os requisitos de certificação FIPS. Mas existem alternativas para CryptoJ que são muito, muito mais barato.
Em geral, eu recomendo a geração de uma nova chave para cada mensagem que você criptografar com uma cifra simétrica como Rijndael, e, depois, criptografar a chave com um algoritmo assimétrico como RSA. Estas chaves privadas podem ser armazenados em um armazenamento de chaves baseado em software protegido por senha como PKCS # 12 ou "JKS" do Java, ou, para maior segurança, no hardware "smart card" símbolo ou outro módulo de hardware criptográfico.
Como minha empresa recentemente descobri, AES não é bastante Rijndael. AES tem a restrição de que chaves devem ser 128, 192, ou 256 bits -. No entanto, permite que Rijndael para as chaves que são 160 e 224 bem como
Tal como indicado por Erickson acima, BouncyCastle fornece um objeto Rijndael que suporta os comprimentos de chave adicionais: 128/160/192/224/256 pedaços. Especificamente, dê uma olhada na API leve.
Gnu-cripto é outra biblioteca de código aberto -. No entanto, também não fornece suporte para chaves de 160 e 224 bits
Então, se você está procurando especificamente suporte completo Rijndael, então BouncyCastle é o único que eu encontrei até agora.
javax.crypto tem suporte AES: http: // java. sun.com/developer/technicalArticles/Security/AES/AES_v1.html
Quanto ao armazenamento seguro de chave, o método usual é derivar uma chave de encriptação a partir da entrada de utilizador (senha) utilizando uma função hash criptográfico, e usar a chave derivada para criptografar o chaveiro. Ou, se você só precisa de uma chave, você pode usar a chave derivada si.
Tenha sempre em mente que a segurança do sistema está diretamente relacionada com a força da função hash utilizada. Utilizar uma função hash criptograficamente segura, juntamente com um sal, se possível, e de hash mais do que uma vez (centenas de vezes, por exemplo).
Dito isto, a questão é muito vaga.