我们需要保护客户数据并将FirebirdSQL 2.5(.8)与Delphi 7一起使用 如果“主”失败,还必须在“辅助”PC或笔式驱动器上进行定期备份。
为此,我们使用this方法,使用stdin / out调用Gbak.exe和7z.exe。
实现这是一个坏主意,因为在过程中很容易看到添加到命令行的参数(密码),即使使用简单的任务管理器也是如此。
有更安全的方法吗?
(使用标准的Interbase组件OR UIB)
答案 0 :(得分:1)
升级到Firebird 3,增加了Database Encryption功能。如果您不想要或不想,我相信您可以使用 STDOUT 选项从您的应用程序运行GBAK工具,但不是使用7-zip进行压缩,您可以在您的应用程序,并通过一些加密库即时加密此类输入。
我相信您可以找到许多示例,如何运行应用程序并在此处读取其标准输出(here is something related to start with),其余的可能是找到一种即时流加密方式。或者只是在一个流中捕获 STDOUT 并在另一个流中捕获。
答案 1 :(得分:1)
他们建议阅读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);
的源代码中找到恢复。