我在Inno Setup脚本中有一个Pascal脚本代码,可以从用户输入中获取DBURI,并将其保存到文件中,以便应用程序可以读取此字符串并连接到数据库。
DBURI :=
'Databaseserver//'+DatabaseUserName+':'+DatabasePassword+'@'+
Host+':'+Port+'/'+DatabaseName+'"';
SaveStringToFile(dbconf, DBURI, True);
它完美地工作。但是问题是字符串未加密,任何浏览该文件的人都可以获得数据库密码。我想在Pascal脚本代码中使用带有预定义密钥的加密方法,然后将输出值(加密的字符串)写入文件。 因此,我可以在应用程序代码中包含加密方法和密钥,以解密值并开始使用DBURI字符串。
那么,我的问题是如何在Pascal脚本代码中使用带有预定义密钥的加密方法(任何人)? 我在Pascal文档中找到了很多文章,但是我不知道如何使用?
答案 0 :(得分:1)
您的问题相当广泛,因此我也将广泛回答。
一些事实:
通常,没有真正安全的方法来加密数据(数据库密码),以便可以自动使用它们。即使您使用加密密钥。从二进制文件中检索密钥并不难。特别是Inno Setup代码很容易分解。参见Disassembling strings from Inno Setup [Code]。尽管您似乎愿意接受甚至简单的无密钥Base64编码,但您的安全需求可能并不那么高。
Inno Setup(或其Pascal脚本代码)不支持加密。您必须使用外部功能或应用程序。尽管可以在Pascal脚本代码中实现一些简单的编码(而不是加密),例如Base64。
您可以做什么:
如果要使用与加密数据相同的本地帐户解密数据(同一用户安装并使用该软件),请使用Windows CryptoAPI。这确实是安全的,因为它使用了与本地帐户关联并受帐户密码保护的密钥。但是如上所述,这限制了使用。
请参见Simple AES encryption using WinAPI。
我没有尝试在Pascal Script中实现此功能,但我相信应该有可能。
我相信即使知道密钥(在安装程序和应用程序之间共享),您也可以使用CryptoAPI,但我不知道详细信息。
使用已知密钥加密数据的另一种方法是为此调用外部应用程序。您可以使用PowerShell和.NET类来实现加密。或者,您可以向自己的应用程序添加隐藏功能,您可以从Inno Setup调用该功能以加密和存储数据。
如果您对Base64(或十六进制)编码感到满意,请参见:
Encode string to Base64 in Inno Setup (Unicode Version of Inno Setup)