오랫동안 관련 답변을 찾으려고했으나 아직 확신이 없습니다.Rfc2898DeriveBytes - 암호 길이
나는 RijndaelManaged를 사용하여 암호화하려고합니다. Key를 만들려면 암호, 소금 및 반복을 Rfc2898DeriveBytes에 전달하고 있습니다.
사용자가 입력 한 암호가 Rfc2898DeriveBytes에 전달되기 전에 특정 길이 미만인 경우 상수를 추가하려고합니다.
지금까지 상수를 추가해도 보안에 어떤 이점도 추가되지 않는다는 것을 발견했습니다. 공격자가 소금과 함께 암호화 된 데이터를 포함하는 데이터베이스에 액세스 할 수 있지만 상수가 아니라면 그에게 조금 더 힘든 시간을 줄 것이라고 가정 해 봅시다. 결국 그는 그 사실을 발견 할 것이다.
또는 걱정하지 않고 Rfc2898DeriveBytes에 길이 암호를 전달하는 것이 "정말로 매우 안전합니다"?
더 짧거나 긴 암호를 전달하면 키 유도 프로세스에 영향을 미치지 만 어느 것이 더 좋고 가장 권장 되는가?
지금까지 내가 알고있는 것은 무작위적인 소금과 더 많은 반복이 중요합니다.
다음 코드는 암호에 상수를 추가하거나 제거해야합니까?
:
string constant = "AnyConstantToMakePasswordBigger";
if (password.Length < 8)
{
password = password + constant;
}
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] salt = new byte[8];
rng.GetBytes(salt);
Rfc2898DeriveBytes derivedKey = new Rfc2898DeriveBytes(password, salt, 1000);
using (RijndaelManaged aes = new RijndaelManaged())
{
aes.Key = derivedKey.GetBytes(keyLength);
.....
}
긍정적 또는 부정적인 의견과 응답을 환영 (주 사용자에게 암호 길이 제한은 GUI에 적용되지 않으며, 사용자는 1 자 또는 10 자 이하를 전달할 수 있습니다).
유일한 해결책은 사용자가 적어도 특정 길이의 암호를 입력하도록 요구하는 것입니다. 상수 이상의 라운드를 추가하는 것은 1 문자 암호를 보충하지 않습니다. – mfanto
예, 소금 및 기타 반복이 더 중요합니다. 사실 BCrypt가하는 일은 반복 작업의 반복입니다. 나는 더 긴 패스워드를 만들기 위해 지속적인 데이터를 추가하는 것이 많은 차이를 만들지는 않을 것이라고 생각한다. 패스워드의 유효 보안 깊이를 바꾸는 것은 아니다. –
상수를 추가하는 것은 의미가 없습니다. 소금은 이미 당신이 성취하고자하는 목적을 성취합니다.사실, 상수를 추가하면 잠재적 인 보안 문제가 악화 될 수 있습니다 (하지만 'Rfc2898DeriveBytes'로는 안전 할 것입니다). 보안을 향상 시키려면 암호의 길이가 최소가되도록하십시오. – Jodrell