선호하는 방법이 될 것입니다 KeyGenerator
사용. 던컨 (Duncan)이 지적했듯이 초기화하는 동안 키 크기를 확실히 지정합니다. KeyFactory
은 기존 키에 사용해야하는 방법입니다.
좋아, 그럼이의 핵심적 껄끄 러운 얻을 수 있습니다. 원칙적으로 AES 키는 모든 값을 가질 수 있습니다. (3) DES와 같이 "약한 열쇠"는 없습니다. 또한 (3) DES 패리티 비트와 같이 특정 의미를 갖는 비트도 없습니다. 따라서 키를 생성하는 것은 임의의 값을 갖는 바이트 배열을 생성하고 그 주위에 SecretKeySpec
을 생성하는 것처럼 간단 할 수 있습니다.
그러나 여전히 사용하는 방법에는 장점이 있습니다. KeyGenerator
은 특별히 키를 생성하기 위해 만들어졌습니다. 즉, 코드가이 세대에 맞게 최적화 될 수 있습니다. 이 은의 효율성과 보안 이점을 가질 수 있습니다. 예를 들어, 키를 노출시키는 타이밍 측면 채널 공격을 피하도록 프로그래밍 될 수 있습니다. 키 정보가 스왑 파일로 누출 될 수 있으므로 byte[]
을 지우는 것이 좋습니다. (어쨌든 이런 경우 일 수 있습니다.) 말했듯
또한, 모든 알고리즘은 완전 랜덤 키를 사용한다. 따라서 KeyGenerator
을 사용하면 다른 알고리즘으로 쉽게 전환 할 수 있습니다. 보다 현대적인 암호는 완전히 무작위 키만을 받아 들일 것입니다. 이것은 예를 들어 DES.
마지막으로, 내 경우에는 가장 중요한 이유는 KeyGenerator
메서드가 보안 토큰 (스마트 카드, TPM, USB 토큰 또는 HSM) 내에서 AES 키를 처리하는 유일한 유효한 방법이라는 것입니다. 그런 다음 SecretKeySpec
으로 byte[]
를 만드는 경우 키 는 메모리에서 가져와야합니다. 즉, 키가 보안 토큰에 포함될 수 있지만 키는 메모리에 관계없이 노출됩니다. 일반적으로 보안 토큰은 보안 토큰에서 생성 된 키로 만 작동하거나 예를 들어 스마트 카드 또는 키 의식. KeyGenerator
은 제공자와 함께 제공되어 키가 보안 토큰 내에서 직접 생성 될 수 있습니다.
Duncan's answer에 표시된대로 항상 키 크기 (및 기타 매개 변수)를 명시 적으로 지정하십시오. 이 일 때 응용 프로그램의 작업 내용이 명확하지 않으며 각 공급자마다 고유 한 기본값이있을 수 있으므로 공급자 기본값을 사용하지 마십시오.
이 mighth 도움 http://stackoverflow.com/questions와 랜드를 대체 : 이것은 내가 무엇을 사용/10252449/is-aes-key-random – Tala
@Tala 이것이 내가 [인용 된 코드] (http://stackoverflow.com/a/10252662/1005481)를 발견 한 곳입니다. 그러나 그 글에서 무작위 키를 만드는 법에 대한 합의를 결정할 수 없었고, 왜 그것이 안전한 방법인지를 결정할 수 없었습니다. –