我设法对使用以下代码输入的密码进行简单加密,然后在标签标题中显示加密密码,
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中显示的加密密码转换回其原始形式,点击另一个按钮,我无法弄清楚如何做到这一点。有什么建议吗?
答案 0 :(得分: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;
答案 1 :(得分:4)
我知道这是为了完成家庭作业而且想法是获得反转代码,而其他人为此目的提供了太多细节,但我需要将其作为答案,因为它的概念太重要了,不能在注意:
如果您真的在谈论密码,那么您必须不使密码可以反转。用户期望他们的密码是安全可靠且不可逆的。
如果您想要这样做的原因是因为您想忘记密码时发送密码,那么答案就是不要。
当一个人丢失或忘记密码时,你应不将其提供给他们,因为这证明它是不安全的。相反,正确的做法是,在确保他们是注册的用户(通过电子邮件地址或其他方式)后,允许他们输入他们选择的新密码。
答案 2 :(得分:2)
如果你决定按照你所描述的方式去做,你可以通过改变这条线来使它变得可逆:
EncryptedCharValue := IntToStr (Ord(PasswordChar) * 5 + 14);
到
EncryptedCharValue := format('%.4d', [Ord(PasswordChar) * 5 + 14]);
这将允许您稍后将字符串分成四个字符的块,减去14,除以5,然后将其转换为字符。 我支持我之前的评论 - 如果你确实有一个需要可逆安全性的用例,请使用更强大的算法,例如this question中讨论的那样。
[编辑:四个字符显然更加强大]
答案 3 :(得分:1)
您的功能是一种非常简单的哈希算法,无法逆转。以可以反转的方式存储密码是没有意义的,因为它不会增加任何额外的安全层(除非您使用基于非对称加密的复杂方案)
答案 4 :(得分:0)
简单哈希算法: How do I hash a string with Delphi?
使用密钥算法(CRAM,HMac)进行哈希: HMAC-SHA256 in Delphi