Fejl ved generering af nøgle / brug af genereret nøgle
HejI forbindelse med dette indlæg: http://www.eksperten.dk/spm/965248 er jeg stødt på et problem som jeg ikke helt forstår. Alt afhængigt af hvad jeg sender med som password og salt, så fejler koden på forskellig måde. Typisk er det samme fejl som omtalt i indlægget, selvom koden tager højde for Arnes forslag. Den anden fejl der oftest kommer, er at længde af "salt ikke er på 8 bytes eller derover" Jeg er kommet frem til at det har med længden/størrelsen af password og salt at gøre, da der ved generering af "theKey" stilles nogle krav til password og salt.
Jeg har derfor forsøgt at rette op på problemet med følgende kode:
public string SetLegalLength(string inString, int minSize, int maxSize,
int blockSize, bool asBytes)
{
int bitFactor = asBytes ? 8 : 1;
string tmpString = inString;
int tmpSize = tmpString.Length * bitFactor;
if (tmpSize > maxSize)
{
// Extract maximum size allowed
tmpString = tmpString.Substring(0, maxSize / bitFactor);
}
else if (tmpSize < maxSize)
{
// Set valid size
int validSize = (tmpSize <= minSize) ? minSize :
(tmpSize - tmpSize % blockSize) + blockSize;
if (tmpSize < validSize)
{
// Pad the key with asterisk to make up the size
tmpString = tmpString.PadRight(validSize / bitFactor, '*');
}
}
return tmpString;
}
som jeg for passwordets vedkommende kalder således:
passwordLegal = SetLegalLength(password, symAlgo.LegalKeySizes[0].MinSize,
symAlgo.LegalKeySizes[0].MaxSize,
symAlgo.LegalKeySizes[0].SkipSize,
true);
Og for saltets vedkommende således:
saltLegal = SetLegalLength(salt, 8, 256, 1, false);
hvorefter jeg anvender passwordLegal og saltLegal fremfor password og salt når theKey skal genereres via:
Rfc2898DeriveBytes theKey = new Rfc2898DeriveBytes(passwordLegal, Encoding.ASCII.GetBytes(saltLegal), 1000);
Problemet kommer uanset om jeg sender true eller false med ind ved beregningen af saltLegal.
Jeg har på fornemmelsen at der er tale om et problem med de grænseværdier som jeg anbender ved beregningen af saltLegal. Encodingen mistænker jeg også for at spille ind på en eller anden måde.
Der er følgende forudsætninger for den løsning som jeg søger på mit problem:
1.
Password og salt kommer "udefra", dvs. i sidste ende fra noget som brugeren har indtastet, og kan derfor ikke på nogen måde hardcodes, men skal via kode gøres "lovligt" så koden kan eksekvere uden at gå ned på at password og salt ikke opfylder betingelserne.
2.
Der kan forekomme danske tegn samt specialtegn i både password og salt, hvilket skal kunne håndteres.
Geniale indspark der virker, eller kan bringe mig på sporet af en løsning er YDERST velkommen.
/Morten