Ich verwende NHibernate und habe einen benutzerdefinierten Typ zum Verschlüsseln von Kennwörtern in der Datenbank, sodass ich Zeichenfolgeneigenschaften zur Darstellung von Kennwörtern verwenden kann, aber NHibernate transformiert/verschlüsselt den Wert, bevor er in der Datenbank gespeichert wird. Momentan speichere ich einen Salt-Wert und einen Verschlüsselungsschlüssel in der Konfigurationsdatei, aber ich würde lieber zu einem Passwort-Hash wechseln. Der benutzerdefinierte NHibernate-Typ weiß jedoch nichts über das Objekt, das gespeichert wird, außer dem Wert der Eigenschaft, mit der es behandelt werden soll. Daher kann ich kein zufälliges Salz generieren und es mit dem Objekt in einer anderen Eigenschaft innerhalb dieses benutzerdefinierten Typs speichern .Ist es in Ordnung, ein Salz aus einem Passwort abzuleiten und dann das Passwort + abgeleitetes Salz zu hashen?
Da ich das Salz nicht getrennt speichern kann, frage ich mich, ob es in Ordnung wäre, das Salz aus dem Passwort selbst abzuleiten, und dann die Kombination der beiden Hash-Werte. Zum Beispiel könnte ich das Passwort nehmen, MD5 es Hash, dann verwenden Sie den MD5-Hash als Salz. Wäre das in Ordnung? Dies würde es mir ermöglichen, das Passwort deterministisch beizubehalten, während ich einen eindeutigen (aber abgeleiteten) Salt-Wert pro Passwort verwende, aber gibt es irgendwelche Sicherheitsüberlegungen, wenn es so gemacht wird?
EDIT:
Da alle Antworten habe ich bisher erhalten habe versäumt für den Kontext der Frage zu erklären, mir die Unterschrift des in NHibernate Begriffe definiert Methode darstellen lassen.
public override void Set(IDbCommand cmd, object value, int index)
{
var param = (IDataParameter)cmd.Parameters[index];
if (value == null)
{
param.Value = null;
}
else
{
var temp = value.ToString();
var encrypted = encryptor.Encrypt(temp);
param.Value = encrypted;
}
}
Das ist alles, was NHibernate mir gibt. Ich erhalte das IDbCommand-Objekt, einen Wert und einen Parameterindex. Ich weiß nichts über die Parameter selbst oder den Typ des Objekts, das beibehalten wird. Ich habe nur einen Wert. Ich kann kein zufälliges Salz erzeugen und es in einer separaten Eigenschaft speichern, weil ich nicht weiß, welche Eigenschaften auf dem Objekt bestehen und welche Reihenfolge sie in der Parametersammlung gespeichert sind. Mein Ziel ist es, das Passwort so sicher wie möglich zu hashen im Rahmen dieser Methode Anruf. Wenn Sie gegen meinen Vorschlag argumentieren, wäre es hilfreich, eine alternative Idee in diesem Zusammenhang zu erhalten.
+1 für die Frage vor der Implementierung eines hausgebrauten Kryptographie-Schema, das ist fast nie eine gute Idee. –
Wie werden Sie den resultierenden Hash für die Authentifizierung verwenden? Normalerweise würde die Anwendung Salt, Iterationen und Hash-Werte für einen bestimmten Anmeldenamen abrufen. Dann würde es einen neuen Hash berechnen, der ein Passwort und die Salz- und Iterationsparameter, die es von der DB erhalten hat, berechnet und den neuen Hash mit dem gespeicherten Wert vergleicht. – erickson