Ich habe diese Abfrage in Sql Server 2000:
select pwdencrypt('AAAA')
die eine verschlüsselte Zeichenfolge von 'AAAA' ausgibt:
0x0100CF465B7B12625EF019E157120D58DD46569AC7BF4118455D12625EF019E157120D58DD46569AC7BF4118455D
Wie kann ich die Ausgabe von ihrem Ursprung (der 'AAAA' ist) konvertieren (entschlüsseln)?
Ich glaube, pwdencrypt verwendet einen Hash, so dass Sie nicht wirklich die gehashte Zeichenfolge umkehren können - der Algorithmus ist so konzipiert, dass es unmöglich ist.
Wenn Sie das von einem Benutzer eingegebene Kennwort überprüfen wollen, besteht die übliche Technik darin, es zu hashen und dann mit der gehashten Version in der Datenbank zu vergleichen.
So könnten Sie eine vom Benutzer eingegebene Tabelle überprüfen
SELECT password_field FROM mytable WHERE password_field=pwdencrypt(userEnteredValue)
Ersetzen Sie userEnteredValue durch (große Überraschung) den Wert, den der Benutzer eingegeben hat :)
Ihnen ist klar, dass Sie sich für die Zukunft einen Strick drehen könnten. Bei pwdencrypt() und pwdcompare() handelt es sich um undokumentierte Funktionen, die sich in künftigen Versionen von SQL Server möglicherweise anders verhalten.
Warum wird das Kennwort nicht mit einem vorhersehbaren Algorithmus wie SHA-2 oder besser gehasht, bevor es in die DB eingegeben wird?
Sie können dieses Passwort nicht wieder entschlüsseln, aber es gibt eine andere Methode namens "pwdcompare". Hier ist ein Beispiel, wie man es mit der SQL-Syntax verwendet:
USE TEMPDB
GO
declare @hash varbinary (255)
CREATE TABLE tempdb..h (id_num int, hash varbinary (255))
SET @hash = pwdencrypt('123') -- encryption
INSERT INTO tempdb..h (id_num,hash) VALUES (1,@hash)
SET @hash = pwdencrypt('123')
INSERT INTO tempdb..h (id_num,hash) VALUES (2,@hash)
SELECT TOP 1 @hash = hash FROM tempdb..h WHERE id_num = 2
SELECT pwdcompare ('123', @hash) AS [Success of check] -- Comparison
SELECT * FROM tempdb..h
INSERT INTO tempdb..h (id_num,hash)
VALUES (3,CONVERT(varbinary (255),
0x01002D60BA07FE612C8DE537DF3BFCFA49CD9968324481C1A8A8FE612C8DE537DF3BFCFA49CD9968324481C1A8A8))
SELECT TOP 1 @hash = hash FROM tempdb..h WHERE id_num = 3
SELECT pwdcompare ('123', @hash) AS [Success of check] -- Comparison
SELECT * FROM tempdb..h
DROP TABLE tempdb..h
GO