安全地从Delphi7动态加密和压缩FirebirdSQL 2.5备份

时间:2018-03-25 14:30:26

标签: delphi encryption backup firebird firebird2.5

我们需要保护客户数据并将FirebirdSQL 2.5(.8)与Delphi 7一起使用 如果“主”失败,还必须在“辅助”PC或笔式驱动器上进行定期备份。

为此,我们使用this方法,使用stdin / out调用Gbak.exe和7z.exe。
实现这是一个坏主意,因为在过程中很容易看到添加到命令行的参数(密码),即使使用简单的任务管理器也是如此。

有更安全的方法吗?
(使用标准的Interbase组件OR UIB)

2 个答案:

答案 0 :(得分:1)

升级到Firebird 3,增加了Database Encryption功能。如果您不想要或不想,我相信您可以使用 STDOUT 选项从您的应用程序运行GBAK工具,但不是使用7-zip进行压缩,您可以在您的应用程序,并通过一些加密库即时加密此类输入。

我相信您可以找到许多示例,如何运行应用程序并在此处读取其标准输出(here is something related to start with),其余的可能是找到一种即时流加密方式。或者只是在一个流中捕获 STDOUT 并在另一个流中捕获。

答案 1 :(得分:1)

SQL.ru论坛上的Firebird人说,实际上可以使用Services API来远程获取备份流。 这并不意味着IBX或UIB或任何其他图书馆都乐意支持它。也许它确实如此,也许不是。

他们建议阅读Firebird 2.5.2或Firebird 2.5.2+安装的 doc \ README.services_extension.txt 文件的第4部分的发行说明

以下是后者的一小段摘录:

  

使用此功能的最简单方法是fbsvcmgr。备份数据库   大致运行以下内容:

fbsvcmgr remotehost:service_mgr -user sysdba -password XXX action_backup -dbname some.fdb -bkp_file stdout >some.fbk

  

并恢复它:

fbsvcmgr remotehost:service_mgr -user sysdba -password XXX action_restore -dbname some.fdb -bkp_file stdin <some.fbk

  

请注意 - 执行备份时不能使用“详细”开关   因为从服务器到客户端的数据通道用于传递块   fbk文件。如果您尝试,将收到相应的错误消息   它。在没有恢复数据库详细模式的情况下可以使用   限制。

     

如果您想从自己的程序执行备份/恢复,那么   应该使用服务API。备份非常简单 - 只需通过   "stdout"作为服务器的备份文件名,并使用isc_info_svc_to_eof   isc_service_query()致电。通过重复调用返回的数据   isc_service_query()(当然带有isc_info_svc_to_eof标签)是一个   流,表示备份文件的图像。

     

恢复有点棘手。客户端发送新的spb参数   isc_info_svc_stdin到服务器   isc_service_query()。如果服务需要stdin中的某些数据,则返回   查询结果中isc_info_svc_stdin,后跟4个字节的值 -   服务器已准备好从客户端接受的字节数。 (0值表示   现在不再需要数据。)主要技巧是客户端   不应发送超过服务器请求的数据 - 这会导致   错误"Size of data is more than requested"。数据将在下一个发送   isc_service_query()使用send_items块调用isc_info_svc_line   传统形式的isc_info_svc_line, 2 bytes length, data代码:isc_info_svc_stdin。当服务器需要下一部分时,它会再次返回   来自isc_service_query()的非零fbsvcmgr值。

     

有关如何使用服务API进行远程备份的示例   可以在 byte[] imgdata = System.IO.File.ReadAllBytes(pathToImage); 的源代码中找到恢复。