求,在linux下的oracle如何防止什么又称为蛮力攻击击

针对 Telegram Passport 的填充 Oracle 攻击阅读//5b.cdn.sohucs.com/images/a70aac495f.jpeg作者:TheZero是KeePassXC的维护者,以前是F-Droid的合作者。
自Telegram Passport问世以来,我试图分析其协议,以了解用户数据的加密是否强大且正确实施。
该规范描述了一种集中式加密存储,其中“用户将文档上传一次,然后可以立即与需要实际ID的服务(金融和ICO等)共享数据。”如果你想阅读完整的规范,可以查看Telegram的说明文档(https://core.telegram.org/passport)。
本文将着重介绍由Telegram设计的与AES-CBC一起使用的自定义填充(padding),以及它如何可能被滥用。Telegram客户端与第三方服务共享用户文档时用到该流程。
注意:本文不会描述针对Telegram服务的直接漏洞。
TelegramPassport的工作流程
该规范涉及3个实体:
1. 最终用户
2. Telegram Passport服务器,用户的文档存储在这里
3. 将接收文档的第三方服务(比如Telegram机器人)
如上所述,我将注意力放在了第3个实体以及第三方服务为了能从Telegram获取用户的数据需要实现的解密机制上。规范中定义该交互的部分如下:
解密数据想解密收到的数据,先要解密EncryptedCredentials中含有的登录信息。1、使用你的私钥来解密登录信息私密内容(EncryptedCredentials中的secret字段),设置OAEP填充选项,比如PHP中的OPENSSL_PKCS1_OAEP_PADDING2、使用该私密内容和登录信息哈希值(EncryptedCredentials中的hash字段),计算credentials_key和credentials_iv,如下描述:3、使用credentials_key和credentials_iv,由AES256-CBC解密登录信息数据(EncryptedCredentials中的data字段)。重要说明:在这一步,确保登录信息哈希值等于SHA256(credentials_data)4、登录信息数据用32个至255个随机填充字节来填充,让其长度可被16字节整除。第一个字节含有该填充的长度(包括该字节)。删除填充以获得数据。
用户文档(规范中名为“登录信息数据”)用AES256-CBC来加密。该操作模式有一定的延展性:在解密过程中,改变密文的一位就会导致相应的明文块完全损坏,但它倒置后面明文块中相应的位,而其余块原封不动。
该属性使实现的CBC模式容易受到填充oracle攻击(paddingoracle attack)。更具体地说,攻击者想要攻破CBC加密机制,只要知道某个特定的密文是否生成拥有有效填充的明文。如果你可以输入密文,并设法查明它们是否解密成有效填充的明文,你就可以解密任何特定的密文。
如果你想了解填充oracle攻击的更多信息,请阅读这篇很棒的文章(https://robertheaton.com//padding-oracle-attack/)。
就个人而言,我对攻击者针对Telegram实施填充攻击很感兴趣也很惊讶。它不是像PKCS#5或PKCS#7那样的标准填充,而是自定义填充:原始数据填充了任意数量的随机字节,在32个和255个之间,使有效载荷的大小是16(AES块大小)的倍数;填充的第一个字节包含用于填充的字节数,包括它本身。
规范不是很清楚,但我们从客户的源代码可以看到发生了什么。下面用Python表明了填充的工作机理:
EncryptedCredential是一个加密的JSON对象,它含有3个字段:data、hash和secret。我们并不关心有多少个填充字节。重要的是含有填充长度的那个“魔法字节”(magic byte)。
data包含用base64编码的、经过加密的JSON序列化数据
hash包含用base64编码的数据哈希值,用于数据验证
secret包含用base64编码的私密内容,以机器人的公共RSA密钥来加密。
请注意,JSON对象始终以{字符开头,以}结束。继续介绍下文之前,请注意Telegram要求开发人员检查:解密的填充数据的SHA-256哈希值与JSON有效载荷中提供的哈希值匹配,实际上使填充oracle攻击无法得逞。然而,如果第三方开发人员未执行这项检查,这种攻击仍然有效。
在我们的场景中,将接收该加密JSON对象的第三方服务(比如Telegram机器人)将执行下列步骤:
1. 使用机器人的私钥解密secret有效载荷
2. 像上述规范那样,计算key和iv
3. 解密data有效载荷
4. 逆填充data明文:
1)搜索明文中的第一个}字符
2)将下一个字节读取为“填充字节”
3)检查填充长度是否与“填充字节”的值匹配
4)如果没有}字符或填充长度不匹配,报告填充错误
5. 读取JSON data。如果JSON无效,报告编码错误,否则报告成功。
针对PKCS#5的标准填充oracle攻击先蛮力攻击密文的最右边字节,直到填充正确,这意味着解密的明文以0x01结束。
在本例中,我们无法以这种方式执行攻击。最后一个N字节是随机字节,所以采用蛮力攻击不会获得任何有用的结果。此外,由于我们采用了倒退法,迟早我们会修改含有“填充字节”的密文块;由于CBC的延展性作用于下一个块,我们会破坏所有块。
我改而使用的方法是从左到右对密文逐个字节地进行位翻转(与255进行异或运算)。
从密文最左边的字节开始,对其进行位翻转,那样第一个明文块就会被破坏,但第二个明文块中的第一个字节也会被位翻转。这样我们会破坏当前块中的实际的JSON daba,但是当我们遇到下一个块中的}字符时,服务将报告填充错误。
这种方法容易出现误报。比如说,考虑这种情况:损坏的数据返回新的}字符,无意中后面跟着确切的填充长度;服务报告填充错误时,我们将对同一字节执行另一个测试,改而用127与它进行异或运算。如果服务再次返回填充错误,我们基本上可以确信找到了“填充字节”。
借助这种机制,我们可以了解关于填充长度和有效载荷长度的信息,并且知道针对实际的填充oracle攻击从何处入手。
假设明文以下面这种方式组成:
}字符在第20位
填充长度字节在第21位
想了解第19位的明文值,我们需要得到其中间值,然后用该位置的密文值与它进行异或运算。
第一个块包含空字节(x00),除了第3个字节和第4个字节,这是我们想要蛮力攻击的两个字节。我们可以蛮力攻击明文中的第19个字节和第20个字节,只要蛮力攻击密文中的第3个字节和第4个字节(19-16= 3),并为填充oracle提供2个块:
第二个块包含我们想要解密的加密字节
一旦我们了解了第19个位置的值,就可以针对第18个字节和第19个字节重复同样的过程,依此类推获得所有明文*。
如上所述,这种方法也容易出现误报,所以一旦我们找到了有效值v,就通过把第一个块中的空字节换成 xff来执行验证步骤。
*遗憾的是,在我们的场景中,我们无法解密所有明文,因为第一个块用我们不了解的IV进行了异或运算。然而,考虑到第一个块以{"data":" + base64_of_image_header开头,我们可能会蛮力攻击它。
“给你看看代码!”
我在撰写本文时,编写了一个实现我们定义的场景的简单服务器以及执行填充oracle攻击的客户端,以演示我们的发现。
代码很糟糕,远远谈不上是稳定版本,不过你可以在这里下载(https://github.com/PequalsNP-team/pequalsnp-team.github.io/tree/master/assets/TelegramPassport)。
使用python2 tpassport.py运行服务器,然后使用python3passport_oracle.py运行客户端。你可能需要解决某些依赖项才能运行脚本。
你将哪种类型的填充与CBC模式一起使用并不重要,总有一种方法可以用在填充oracle场景中以解密密文。
如果你计划使用CBC,始终在加密之前以一种先加密后MAC的方式执行完整性检查;如果可能的话,使用HMAC对数据进行验证。如果可能的话,根本不要使用CBC,而是青睐像GCM这样的AE/AEAD模式。
最后但并非最不重要的是:别使用你自己的加密方法!
原文链接:https://pequalsnp-team.github.io/writeups/analisys_telegram_passport?from=timeline&isappinstalled=0Oracle账户密码HASH在不同机器中是一样的
Oracle安装单个补丁的命令是opatch
1.数据库主机管理员账号
控制默认主机管理员账号,禁止使用orale作为数据库主机管理员账号
查看启动进程用户是否为oracle:
$ps -ef |grep ora_
删除或多顶与数据库运行/维护等工作无关的账号
Sql&select username from dba_users where account)status='OPEN'
2.删除无用账号
加固方法:锁定无用账号
SQL&alter user 用户名
SQL&alter user 用户名
备注:可通过查询密码串列出使用默认密码的账户
3.默认账号修改口令
修改默认账户和密码
Oracle 10g
SQL&select username,password,account_status,profile from dba_
Oracle 11g 以上检查默认密码:
SQL&SELECT * FROM DBA_USERS_WITH_DEFPWD;
修改密码:SQL&alter user 用户名 idetify by ‘密码’
4.限制数据库SYSDBA账号
限制具备数据库超级管理员(SYSDBA)权限的用户远程登陆及自动登陆
检查remote_login)passwordfile 的值是否为NONE
SQL&show parameter REMOTE_LOGIN_PASSWORDFILE
SQL& Alter system set remote_login_passwordfile=NONE scope=spfile
5.口令策略
对于采用静态口令认证技术的数据库,需对口令策略进行安全设置。
检测方法:查看各项值是否符合:
密码复杂度校验:PASSWORD_VERIFY_FUNCTION function_namme
密码到期宽限天数:PASSWORD_GRACE_TIME 5
密码使用周期天数:PAASSWORD_LIFE_TIME 180
重用密码最大数量:PASSWORD_REUSE_MAX 5
SQL&select resource_name,limit from dba_profile where profile='DEFAULT' and resource_type ='PASSWORD';
加固方法:
需要执行$ORACLE_HOME/rdbms/admin/utlpwdmg.sql建立密码校验函数
$sqlplus “/ as sysdba” @$ORACLE_HOME/rdbms/admin/utlpwdmg.sql
然后修改缺省profile:
#SQL&alter profile DEFAULT limit PASSWORD_LIFE_TIME 180 PASSWORD
………………..
6.账号锁定策略
尝试次数5次
锁定账户天数:PASSWORD_LOCK_TIME .0069
连续失败次数:FAILED_LOGIN_ATTEMPTS 5
SQL&select resource_name,limit from dba_profiles where profile='DEFAULT' and resource_tpe='PASSWORD';
修改缺省profile:
SQL&alter profile default limit FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 10/1440;
锁定账户的时间单位为天,所以计算10分钟为0.00694
7.public权限
清理public各种默认权限,攻击者可能利用程序包的public 角色执行权限获得非法访问,威胁系统安全/
UTL_FILE,UTL_TCP,UTL_HTTP,UTL_SMTP,DBMS_LOB,DBMS_SYS_SQL
SQL&select table_name from dba_tab_privs where grantee='PUBLIC' and privilege='EXECUTE' and table_name in ('
UTL_FILE','UTL_TCP,UTL_HTTP,UTL_SMTP,DBMS_LOB,DBMS_SYS_SQL',dbms_job','dbms_scheduler'
8.数据库角色管理
使用数据库角色来管理对象的权限
加固方法:
使用create role 命令创建角色并赋予系统/对象或Role的权限到此角色
SQL&create role Role_ZXQ;
Grant create table to Role_ZXQ;
Grant EXP_FULL_DATABASE table to Role_ZXQ;
再将此角色赋予对象“
grant Roles_ZXQ to app_
回退方法:
删除创建角色:
SQL&drop role …
9.启用日志审计
数据库应配置日志功能,记录对于数据库相关的安全事件
SQL&show parameter audit
检查AUDIT_TRAIL取值是否启用,是否设置蛇和级别,在syslog里是否记录对应的事件
加固方法:设置AUDIT_TRAIL-OS ,记录到系统日志中/
SQL&alter system set audit_trail='OS' scope =spfile
回退方法:
SQL&alter system set audit_trail='NONE' scope =spfile
10.日志记录及保存
打开sys日志开关:
SQL&alter system set audit+sys_operations=true scope=spfile
设置审核级别:
SQL&alter system set audit_syslog_level='user.notice' scope=spfile
打开系统日志:
#echo user.notice /var/log/ora_dba.log&&/etc/syslog.conf
关闭系统日志
SQL&alter system set audit+sys_operations=false scope=spfile
取消审核级别
SQL&alter system set audit_syslog_level=''scope=spfile
关闭系统日志
#vi /etc/syslog.conf
11.日志文件保护
设置日志访问权限
$chmod o-rw filename
$chmod u-s filename
12.开启监听器日志
开启监听器日志功能是为了捕获监听器命令和防止密码被暴力破解
查看$ORACLE_HOME/network/admin/listener.ora中是否设置日志舰艇,
LOGGING_LISTERNER=ON
LOG_FILE_LISTER=1.log
LOG_DIRECTORY_LISTER=/ora/prod/100.1.0/Db1/network/admin
也可执行下列命令差:
$lsnrctl show log_status
$lsnrctl show log_file
切换到管理员执行
$ORACLE_HOKE/bin/lsnrctl
LSNRCTL&set log_dirctory &oracle_home路径&network/admin
LSNRCTL&set log_file &sid名称&.log
LSNRCTL&set log_status on
LSNRCTL&save config
13.数据字典保护
启用数据字典保护,只有SYSDBA用户才能访问数据查字典基础表
检测方法:检查参数O7_DICTIONARY_ACCESSIBILITY是否设置为FALSE
SQL&show paramter O7_DICTIONARY_ACCESSIBILITY
14.监听器口令
为数据库监听器的关闭和启动设置密码
检测方法:
检查$ORACLE_HOME/network/admin/lister/ora文件中是否设置参数
PASSWORDS_LISTSENER
$cat $ORACLE HOME/network/admin/listener.ora
加固方法“
LSNRCTL&change_password
Old password:
New password:密码
Reenter new password:密码
LSNRCTL&save_config
设置为空的方法
LSNRCTL&change_passord
Old password:原密码
New password:空
Reenter new password:空
LSNRCTL&save_config
15.监听服务连接超时
设置监听器连接超时,连接后未进行请求则断开连接
检查方法:检查$ORACLE_HOME/network/admin/listener.ora文件中是否设置参数INBOUND_CONNECT_TIMEOUT_listener_name
加固方法:
编辑$ORACLE_HOME/network/adin/listenet/ora.在listener.ora文件中手动加入下面这样一行
INBOUND_CONNECT_TIMEOUT_listener_name=3
回退方法:删除这样一行INBOUND_CONNECT_TIMEOUT_listener_name=3
16.监听器管理限制
17.禁止远程操作系统认证
设置登录认证方式禁止远程操作系统认证。攻击者可能利用数据库对远程操作系统的信任关系威胁系统安全
检测方法:SQL?show parameter REMOTE_OS_AUTHENT
加固方法:设置禁止远程操作系统认证
SQL&alter system set REMOTE_OS_AUTHENT=FALSE scope=file
18.网络连接限制
设置网络连接限制,只允许安全的IP地址链接数据库进行操作。
检测方法:检查$ORACLE_HOME/network/admin/sqlnet/ora文件中是否设置参数tcp.validnode_checking和tcp.invited_nodes
加固方法:修改$ORACLE_HOME/network/admin/sqlnet/ora文件
tcp.validnode_checking=YES
tcp.invited_nodes=(192.168.0.1,10.180.*,10.111.0.0/16)
tcp.validnode_checking=YES针对 Telegram Passport 的填充 Oracle 攻击
作者:TheZero是KeePassXC的维护者,以前是F-Droid的合作者。
自Telegram Passport问世以来,我试图分析其协议,以了解用户数据的加密是否强大且正确实施。
该规范描述了一种集中式加密存储,其中“用户将文档上传一次,然后可以立即与需要实际ID的服务(金融和ICO等)共享数据。”如果你想阅读完整的规范,可以查看Telegram的说明文档(https://core.telegram.org/passport)。
本文将着重介绍由Telegram设计的与AES-CBC一起使用的自定义填充(padding),以及它如何可能被滥用。Telegram客户端与第三方服务共享用户文档时用到该流程。
注意:本文不会描述针对Telegram服务的直接漏洞。
TelegramPassport的工作流程
该规范涉及3个实体:
1. 最终用户
2. Telegram Passport服务器,用户的文档存储在这里
3. 将接收文档的第三方服务(比如Telegram机器人)
如上所述,我将注意力放在了第3个实体以及第三方服务为了能从Telegram获取用户的数据需要实现的解密机制上。规范中定义该交互的部分如下:
解密数据想解密收到的数据,先要解密EncryptedCredentials中含有的登录信息。1、使用你的私钥来解密登录信息私密内容(EncryptedCredentials中的secret字段),设置OAEP填充选项,比如PHP中的OPENSSL_PKCS1_OAEP_PADDING2、使用该私密内容和登录信息哈希值(EncryptedCredentials中的hash字段),计算credentials_key和credentials_iv,如下描述:3、使用credentials_key和credentials_iv,由AES256-CBC解密登录信息数据(EncryptedCredentials中的data字段)。重要说明:在这一步,确保登录信息哈希值等于SHA256(credentials_data)4、登录信息数据用32个至255个随机填充字节来填充,让其长度可被16字节整除。第一个字节含有该填充的长度(包括该字节)。删除填充以获得数据。
用户文档(规范中名为“登录信息数据”)用AES256-CBC来加密。该操作模式有一定的延展性:在解密过程中,改变密文的一位就会导致相应的明文块完全损坏,但它倒置后面明文块中相应的位,而其余块原封不动。
该属性使实现的CBC模式容易受到填充oracle攻击(paddingoracle attack)。更具体地说,攻击者想要攻破CBC加密机制,只要知道某个特定的密文是否生成拥有有效填充的明文。如果你可以输入密文,并设法查明它们是否解密成有效填充的明文,你就可以解密任何特定的密文。
如果你想了解填充oracle攻击的更多信息,请阅读这篇很棒的文章(https://robertheaton.com//padding-oracle-attack/)。
就个人而言,我对攻击者针对Telegram实施填充攻击很感兴趣也很惊讶。它不是像PKCS#5或PKCS#7那样的标准填充,而是自定义填充:原始数据填充了任意数量的随机字节,在32个和255个之间,使有效载荷的大小是16(AES块大小)的倍数;填充的第一个字节包含用于填充的字节数,包括它本身。
规范不是很清楚,但我们从客户的源代码可以看到发生了什么。下面用Python表明了填充的工作机理:
EncryptedCredential是一个加密的JSON对象,它含有3个字段:data、hash和secret。我们并不关心有多少个填充字节。重要的是含有填充长度的那个“魔法字节”(magic byte)。
data包含用base64编码的、经过加密的JSON序列化数据
hash包含用base64编码的数据哈希值,用于数据验证
secret包含用base64编码的私密内容,以机器人的公共RSA密钥来加密。
请注意,JSON对象始终以{字符开头,以}结束。继续介绍下文之前,请注意Telegram要求开发人员检查:解密的填充数据的SHA-256哈希值与JSON有效载荷中提供的哈希值匹配,实际上使填充oracle攻击无法得逞。然而,如果第三方开发人员未执行这项检查,这种攻击仍然有效。
在我们的场景中,将接收该加密JSON对象的第三方服务(比如Telegram机器人)将执行下列步骤:
1. 使用机器人的私钥解密secret有效载荷
2. 像上述规范那样,计算key和iv
3. 解密data有效载荷
4. 逆填充data明文:
1)搜索明文中的第一个}字符
2)将下一个字节读取为“填充字节”
3)检查填充长度是否与“填充字节”的值匹配
4)如果没有}字符或填充长度不匹配,报告填充错误
5. 读取JSON data。如果JSON无效,报告编码错误,否则报告成功。
针对PKCS#5的标准填充oracle攻击先蛮力攻击密文的最右边字节,直到填充正确,这意味着解密的明文以0x01结束。
在本例中,我们无法以这种方式执行攻击。最后一个N字节是随机字节,所以采用蛮力攻击不会获得任何有用的结果。此外,由于我们采用了倒退法,迟早我们会修改含有“填充字节”的密文块;由于CBC的延展性作用于下一个块,我们会破坏所有块。
我改而使用的方法是从左到右对密文逐个字节地进行位翻转(与255进行异或运算)。
从密文最左边的字节开始,对其进行位翻转,那样第一个明文块就会被破坏,但第二个明文块中的第一个字节也会被位翻转。这样我们会破坏当前块中的实际的JSON daba,但是当我们遇到下一个块中的}字符时,服务将报告填充错误。
这种方法容易出现误报。比如说,考虑这种情况:损坏的数据返回新的}字符,无意中后面跟着确切的填充长度;服务报告填充错误时,我们将对同一字节执行另一个测试,改而用127与它进行异或运算。如果服务再次返回填充错误,我们基本上可以确信找到了“填充字节”。
借助这种机制,我们可以了解关于填充长度和有效载荷长度的信息,并且知道针对实际的填充oracle攻击从何处入手。
假设明文以下面这种方式组成:
}字符在第20位
填充长度字节在第21位
想了解第19位的明文值,我们需要得到其中间值,然后用该位置的密文值与它进行异或运算。
第一个块包含空字节(x00),除了第3个字节和第4个字节,这是我们想要蛮力攻击的两个字节。我们可以蛮力攻击明文中的第19个字节和第20个字节,只要蛮力攻击密文中的第3个字节和第4个字节(19-16= 3),并为填充oracle提供2个块:
第二个块包含我们想要解密的加密字节
一旦我们了解了第19个位置的值,就可以针对第18个字节和第19个字节重复同样的过程,依此类推获得所有明文*。
如上所述,这种方法也容易出现误报,所以一旦我们找到了有效值v,就通过把第一个块中的空字节换成 xff来执行验证步骤。
*遗憾的是,在我们的场景中,我们无法解密所有明文,因为第一个块用我们不了解的IV进行了异或运算。然而,考虑到第一个块以{"data":" + base64_of_image_header开头,我们可能会蛮力攻击它。
“给你看看代码!”
我在撰写本文时,编写了一个实现我们定义的场景的简单服务器以及执行填充oracle攻击的客户端,以演示我们的发现。
代码很糟糕,远远谈不上是稳定版本,不过你可以在这里下载(https://github.com/PequalsNP-team/pequalsnp-team.github.io/tree/master/assets/TelegramPassport)。
使用python2 tpassport.py运行服务器,然后使用python3passport_oracle.py运行客户端。你可能需要解决某些依赖项才能运行脚本。
你将哪种类型的填充与CBC模式一起使用并不重要,总有一种方法可以用在填充oracle场景中以解密密文。
如果你计划使用CBC,始终在加密之前以一种先加密后MAC的方式执行完整性检查;如果可能的话,使用HMAC对数据进行验证。如果可能的话,根本不要使用CBC,而是青睐像GCM这样的AE/AEAD模式。
最后但并非最不重要的是:别使用你自己的加密方法!
原文链接:https://pequalsnp-team.github.io/writeups/analisys_telegram_passport?from=timeline&isappinstalled=0
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
今日搜狐热点#include &stdio.h&
#include &math.h&
我们可以避免求平方根,窍门是忽略平方根函数,而只比较(x[i]-x[j])^2+(y[i]-y[j])^2的值本身。
int BruteForceClosestPoints(int n) {
int d=1000, i, j, t, x[100], y[100];
for (i= 1; i & n + 1; i++) {
printf("输入x[%d]和y[%d]:", i, i);
scanf("%d%d", &x[i], &y[i]);
for (i = 1; i & i++)
for (j=i+1; j & n+1; j++) {
t = (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
if (d*d & t) {
return sqrt(d);
int main() {
int n, p[100];
printf("输入点的个数:");
scanf("%d", &n);
printf("最近的距离为:%d\n",BruteForceClosestPoints(n));
运行效果图
蛮力法实现最近对问题
import java.text.DecimalF
import java.util.S
public class Manlifa {
蛮力法最近对问题
//============================================================================
: 最近对问...
蛮力法在求解最优解问题中的应用(JAVA)--旅行家问题、背包问题、分配问题
蛮力法在求解最优解问题中的应用
1、TSP(旅行商问题)要求我们找出一条n个给定城市之间的最短路径,使我们再回到出发的城市之前,对欧每个城市都只访问一次。我们可以用赋权图来描述这个问题,那么算法的目...
(三) 蛮力法
蛮力法(brute force method,也称为穷举法或枚举法)是一种简单直接地解决问题的方法,常常直接基于问题的描述,所以,蛮力法也是最容易应用的方法。
蛮力法特性:
(1)理论上,蛮力法可以解...
最近对问题?
设p1=(x1,y1), p2(x2,y2), ....,pn=(xn,yn)是平面上n个点构成的集合S,最近对问题就是找出集合S中距离最近的点对。
两种算法思想:
1. 蛮力法:...
讲解分治法求最近点对问题的思想与算法实现。
利用分治法求最近点对与归并排序的结构上的相同,将时间复杂度降到真正意义上的O(nlogn)而不是O(nlognlogn)。
1. 预处理:创建结...
分治算法,有很多典型的问题,如最近点问题、线性选择问题、整数划分问题、大整数成绩问题、棋盘覆盖问题、循环赛日程表、二分搜索、Strassen矩阵乘法、汉诺塔等。准备花些时间逐个解决这些问题,并用Jav...
int BruteForceStringMatch(char T[], int n, char P[], int m) {
int i=0, j=0;
平面最近点对问题求解问题描述:
最近点对问题是指求解平面点集n个点中距离最近的两个点间的问题。为简单起见,在二维坐标平面来考虑该问题。如果说讨论的点以标准二维坐标给出,则有点和,那么这两点之间的距...
没有更多推荐了,攻击Oracle的常用手段_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&100W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
攻击Oracle的常用手段
阅读已结束,下载本文需要
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩5页未读,
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 linuxoracle启动监听 的文章

 

随机推荐