gpt4 book ai didi

delphi - Delphi7 中使用 AES (CBC) 在服务器和应用程序之间进行安全通信

转载 作者:行者123 更新时间:2023-12-03 15:57:11 24 4
gpt4 key购买 nike

我正在编写一个与 php 脚本通信的应用程序 (authentication.php?UserID=ClientsEmail@email.com&ClientsID=81E17),如果在 MySQL 数据库中找到客户端,脚本将通知应用程序以及什么客户端可以下载的文件。通过 Internet 进行的所有通信都将采用 AES-256 (CBC) 加密,并且主要加密 key 将被硬编码到可执行文件中。该主 key 每年仅通过重新编译 exe 并将其作为升级传递给所有客户端来更改一次。因为这个 key 很少改变,所以生成一个希望永远不会重复的初始化向量至关重要。

因为我的密文输出是 Base 64。我试图使 IV 尽可能统一,换句话说,看起来就像是密文输出的一部分。

所以我的第一个问题是下面的函数重复出现的可能性有多大。我确实创建了一个带有计时器的测试应用程序,并循环下面的函数,将其添加到数据库中并检查它是否重复。测试应用程序运行了一夜,总共循环了 69369 次,没有重复。

// Generate a  16 bytes = 128 bits Initialization vector Used for AES-256
Function TfrmMain.GenerateIV:String;
Var
i,j : Integer;

Const
{Uppercase}
alpa_L : array[1..26] of string = ('a','b','c','d','e','f','g','h','i','j','k',
'l','m','n','o','p','q','r','s','t','u','v',
'w','x','y','z');
{Lowercase}
alpa_U : array[1..26] of string = ('A','B','C','D','E','F','G','H','I','J','K',
'L','M','N','O','P','Q','R','S','T','U','V',
'W','X','Y','Z');
{numeric}
Num : array[1..10] of string = ('0','1','2','3','4','5','6','7','8','9');
Begin
Result := '';
Randomize;
for i := 1 to 16 do //16 bytes = 128 bits AES=Fixed 128 Blocks
Begin
j := RandomRange(1, 4); //RandomRange - Delphi's help says inclusive but it is non-inclusive
case j of
1: Result := Result + alpa_L[RandomRange(1, 27)]; {alphabetic Uppercase}
2: Result := Result + alpa_U[RandomRange(1, 27)]; {alphabetic Lowercase}
3: Result := Result + Num[RandomRange(1, 11)] {numeric}
end;
end;
end;

说了这么多,我还有另一个想法正在尝试整合。我的想法如下,而不是将主要加密 key 硬编码到可执行文件中。我的服务器将随机生成一个加密 key 并将其不 protected 地传递给我的应用程序。服务器和应用程序之间的所有通信都将使用该 session 的 key 进行加密,一旦所有文件下载完成, session 就会关闭。

上述唯一的问题是,由于加密 key 被发送到不受该 session 保护的应用程序,因此只要有一点悟性就可以看到应用程序和服务器正在通信的内容,并且黑客可以看到身份验证是如何进行的完毕。一旦他/她知道这一点,应用程序就可以重定向到他们的服务器来执行身份验证部分,然后照常继续。解决这个问题的唯一方法是保护这个 key ,但随后我又回到了“硬编码到可执行文件中”的问题

所以我的这个应用程序的第一个版本是将 key 硬编码到可执行文件中,直到我解决了上述问题。

不幸的是,服务器不支持(HTTPS)协议(protocol)

最佳答案

如果加密 key 嵌入到可执行文件中并每年更改一次,则您将无法进行安全通信。有安全 key 交换协议(protocol)(即寻找 Diffie-Hellman),它可以让您安全地交换 session key 。当然,您需要确保您正在与您应该交谈的人(而不是中间人)交谈,因此您可能还需要对端点进行身份验证。

即使服务器不支持 HTTPS,您也可以通过纯 HTTP(或任何其他协议(protocol))自行使用相同的技术。 SSL 与 HTTP 没有任何关系。您只需要编写更多代码,而不是简单地依赖 Web 服务器为您完成所有“脏活”。

关于delphi - Delphi7 中使用 AES (CBC) 在服务器和应用程序之间进行安全通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10205752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com