2012-04-09 2 views
3

я сумел сделать простое шифрование пароля Введенный, используя следующий код, который затем выводит зашифрованный пароль в титрах этикетками,Шифрование пароля

procedure TfrmLogin.edtAddPasswordClick(Sender: TObject); 
var 
    NormalPassword, EncryptedPassword: string; 
    PasswordChar: Char; 
    EncryptedCharValue: string; 
    CharPtr: Integer; 
    Ptr, n: Integer; 
begin 
    NormalPassword := Edit1.text; 
    EncryptedPassword := ''; 
    for CharPtr := 1 to Length(NormalPassword) do 
    begin 
    PasswordChar := NormalPassword[CharPtr]; 
    EncryptedCharValue := IntToStr (Ord(PasswordChar) * 5 + 14); 
    EncryptedPassword := EncryptedPassword + EncryptedCharValue; 
    Label1.Caption := EncryptedPassword; 
    end; 
end; 

Проблема заключается в том, что я хотел бы конвертируйте зашифрованный пароль, отображаемый в label1.caption, в свою первоначальную форму нажатием другой кнопки, и я не могу понять, как это можно сделать. какие-либо предложения?

+6

Как правило, пароли хэшируются, не шифруются.И вы не можете изменить хэш. –

+1

Этот алгоритм не может быть отменен –

+1

Право Оли в принципе, хотя я вижу, что есть некоторые случаи, в которых вы хотели бы этого обратимого; например, приложение для хранения паролей. В этом случае, однако, вы, возможно, захотите использовать более сильный алгоритм и ключ, выбранный пользователем – Geoff

ответ

6

Вместо того, чтобы создавать собственный алгоритм для хеша (или зашифровать) пароль, попробуйте использовать проверенный и надежный алгоритм, такой как SHA1, MD5 и т. д.

Возврат к вашему вопросу для преобразования зашифрованного значения в исходное, все, что вам нужно сделать, это отменить ваш алгоритм, попробуйте этот образец.

var 
    NormalPassword, EncryptedPassword: String; 
    PasswordChar : char; 
    EncryptedCharValue : String; 
    CharPtr : Integer; 
begin 
    NormalPassword :=''; 
    EncryptedPassword := Label1.Caption; //here is stored the encrypted password 
    CharPtr := 1; 
    while CharPtr< length(EncryptedPassword) do 
    Begin 
     EncryptedCharValue:=Copy(EncryptedPassword, CharPtr, 3); 
     Inc(CharPtr, 3); 
     PasswordChar  := Chr((StrToint(EncryptedCharValue)-14) div 5); 
     NormalPassword :=NormalPassword+ PasswordChar; 
    end; 
    Label2.Caption := NormalPassword; 
end; 
+0

chr (198) соответствует 4-значному значению, поэтому этот код не работает. И есть входы, которые сопоставляются с 2-значными значениями. –

+0

@DavidHeffernan Это просто домашнее задание для OP, оригинальный алгоритм не является шифром военного класса. так что ответ так же хорош, как и оригинальный алгоритм. – RRUZ

+0

Я просто продолжал разговор о том, можно ли изменить реверс или нет. –

1

Вы используете очень простой алгоритм хеширования, который нельзя отменить. Не имеет смысла хранить пароли таким образом, чтобы их можно было отменить, поскольку он не добавляет дополнительный уровень безопасности (за исключением использования сложной схемы на основе асимметричного криптования)

2

Если вы решили сделать это так, как вы описали, вы могли бы сделать его обратимым путем изменения строки:

EncryptedCharValue := IntToStr (Ord(PasswordChar) * 5 + 14); 

к

EncryptedCharValue := format('%.4d', [Ord(PasswordChar) * 5 + 14]); 

Это позволило бы вы позже вытащите строку в четырехсимвольных кусках, вычтите 14, разделите их на 5 и верните обратно в символ. Я придерживаюсь своего более раннего комментария, хотя - если у вас действительно есть прецедент, который требует обратимой безопасности, используйте более сильный алгоритм, например, как описано в this question.

[Edit: четыре символов явно более надежный]

+0

+1 Этот подход фактически приводит к алгоритму, который обратимо. –

4

Я знаю, что это домашнее задание и идея заключается в том, чтобы получить реверсивный код, а другие предоставляют вам слишком много деталей для этой цели, но мне нужно дайте это как ответ, потому что его концепция слишком важна, чтобы сказать в примечании:

Если вы действительно говорите о пароле, то вы должны не сделать пароль обратимым. Пользователи ожидают своих паролей, которые будут безопасными и безопасными и не обратимыми.

Если причина, по которой вы хотите сделать это, - это то, что вы хотите отправить им свой пароль, если они забудут об этом, тогда ответ будет не.

Когда человек теряет или забывает свой пароль, вы должны не вернуть, потому что это доказывает, что это небезопасно. Вместо этого нужно следить за тем, чтобы убедиться, что они являются пользователем, который зарегистрировался (по электронной почте или другим способом), а затем разрешает им вводить новый пароль по своему выбору.

Смежные вопросы