PL/SQL 如何php调用http接口php接口

&>&Oracle Database 11g PL/SQL程序设计--随书源代码
Oracle Database 11g PL/SQL程序设计--随书源代码
上传大小:1.46MB
CruiseYoung提供的带有详细书签的电子书籍目录
http://blog.csdn.net/fksec/article/details/7888251
该资料是《Oracle Database 11g PL/SQL程序设计》的随书源代码
对应的书籍资料见:
Oracle Database 11g PL/SQL程序设计
原书名: Oracle Database 11g PL/SQL Programming
原出版社: McGraw-Hill Osborne Media
作者: (美)Michael McLaughlin
译者: 张云 王海涛
出版社:清华大学出版社
上架时间:
出版日期:2009 年4月
开本:16开
   设计功能丰富的pl/sql应用程序.
   希望在oracle权威专家的指导下开发出动态的、客户机—服务器pl/sql应用程序吗?这本pl/sql程序设计将帮助您理解pl/sql涉及的所有主题。..
   本书内容丰富,结构合理,全面涵盖oracle database 11g的新增特性和实用工具,并提供详细的说明
、可剪切-粘贴的语法示例和真实的案例分析。通过学习书中的代码和图例,您不仅能访问和修改数据库信息,编写功能强大的pl/sql语句,执行有效的查询和部署稳固的安全性,还能轻松实现c、c++和java过程,建立可启用web的数据库,缩短开发时间和优化性能。
   本书主要内容
   ·创建、调试和管理oracle驱动的pl/sql程序
   ·使用pl/sql结构体、分隔符、运算符、变量和语句
   ·使用plsql warnings和异常处理程序标识和消除错误
   ·使用函数、过程、包、集合和触发器
   ·定义和部署varray、嵌套表和联合数组数据类型
   ·处理外部例程、对象类型、大对象和安全文件
   ·使用dbms alert和dbms pipe在并行会话间通信
   ·通过oracle net services和pl/sql包装器调用外部过程
   ·使用oracle jvm集成内部和服务器端java类库
   ·使用pl/sql gateway和web toolkit开发健壮的web应用程序...
作者: Michael McLaughlin
   Michael McLaughlin是美国BYU-Idaho大学商务和通信学院计算机信息技术系教授,也是Techtinker.com公司的创办者。他曾在Oracle公司工作了8年多,先后从事过顾问、开发和技术支持等工作,是Oracle公司ATOMS事务体系结构这项专利的发明者。在Oracle公司工作之前,Michael从Oracle 6开始分别担任过Oracle开发员、系统和业务分析员及DBA。. Michael的著作还包括Oracle Dambase 10g Express Edition PHP Web Programming、Oracle Database 10g PL/SQL Programming、Expert Oracle PL/SQL和《AJAX+PHP+Oracle数据库Web开发》。
PL/SQL基本原理 1
Oracle PL/SQL概览 3
历史和背景知识 4
体系结构 5
基本的块结构 7
Oracle 10g的新功能 9
编译时警告 10
条件编译 10
NUMBER数据类型行为 11
优化的PL/SQL编译器 11
正则表达式 12
引号的选择性 12
集合运算符 12
堆栈跟踪错误 13
包装PL/SQL存储程序 14
Oracle 11g的新功能 15
自动子程序内联 15
CONTINUE语句 16
跨会话PL/SQL函数结果缓存 16
增强的动态SQL 16
采用命名和位置等表示法的SQL调用 17
多进程连接池 19
PL/SQL Hierachical Profiler 20
PL/SQL Native Compiler生成本地代码 21
PL/Scope 21
增强的正则表达式 21
SIMPLE_INTEGER 数据类型 21
SQL语句中的直接序列调用 21
PL/SQL基础知识 23
Oracle PL/SQL块结构 24
变量、赋值和运算符 26
控制结构 28
条件结构 28
迭代结构 30
存储函数、过程和包 33
存储函数 34
事务作用域 37
单事务作用域 37
多事务作用域 38
数据库触发器 38
语言基本知识 41
字符和词汇单元 42
变量类型 53
标量数据类型 56
复合数据类型 73
系统引用游标 78
变量作用域 80
控制结构 83
条件语句 84
CASE语句 93
条件编译语句 95
迭代语句 96
简单循环语句 97
FOR循环语句 100
WHILE循环语句 102
游标结构 103
隐式游标 103
显式游标 106
批语句 112
BULK COLLECT INTO语句 112
FORALL语句 116
错误管理 121
异常类型和作用域 122
编译错误 123
运行时错误 125
异常管理内置函数 129
用户定义的异常 131
声明用户定义的异常 131
动态的用户定义的异常 132
异常堆栈函数 133
异常块管理 134
错误堆栈格式化 137
数据库触发器异常管理 139
关键性错误数据库触发器 140
非关键性错误数据库触发器 145
PL/SQL程序设计 147
函数和过程 149
函数和过程体系结构 150
事务作用域 155
调用子例程 156
位置表示法 156
命名表示法 156
混合表示法 156
排除表示法 157
SQL调用表示法 157
创建选项 159
值传递函数 168
引用传递函数 173
值传递过程 177
引用传递过程 181
集合类型 189
varray集合 191
嵌套表 203
联合数组 216
集合运算符 223
CARDINALITY运算符 225
EMPTY运算符 226
MEMBER OF运算符 226
MULTISET EXCEPT运算符 226
MULTISET INTERSECT运算符 226
MULTISET UNION运算符 227
SET运算符 228
SUBMULTISET运算符 229
集合API 229
COUNT方法 231
DELETE方法 232
EXISTS方法 233
EXTEND方法 234
FIRST方法 236
LAST方法 237
LIMIT方法 237
NEXT方法 238
PRIOR方法 238
TRIM方法 239
大对象 241
字符大对象:CLOB与NCLOB数据类型 242
PL/SQL读文件与写CLOB或NCLOB列 246
向数据库中上传CLOB 249
二进制大对象:BLOB数据类型 250
PL/SQL读文件与写BLOB列 252
向数据库中上传BLOB 255
SecureFile 255
二进制文件:BFILE数据类型 257
创建和使用虚拟目录 257
读取规范路径名与文件名 265
DBMS_LOB包 272
包常量 272
包异常 274
打开与关闭方法 275
操作方法 276
内省方法 280
BFILE方法 283
临时LOB方法 285
包体系结构 288
前向引用 289
包规范 292
组件:函数与过程 299
包主体 300
组件:函数与过程 304
定义者与调用者权限 306
授权与同义词 307
远程调用 308
管理数据库目录中的包 309
查找、验证和描述包 309
检查依赖关系 311
比较有效性验证方法:时间戳与签名 312
触发器 313
触发器简介 314
数据库触发器体系结构 315
数据定义语言触发器 317
事件属性函数 318
构建DDL触发器 327
数据操作语言触发器 329
语句级触发器 330
行级触发器 331
复合触发器 334
Instead-of触发器 338
系统或数据库事件触发器 341
触发器限制 343
最大触发器尺寸 343
SQL语句 343
LONG和LONG RAW数据类型 344
变异表 344
系统触发器 345
PL/SQL高级编程 347
动态SQL 349
动态SQL体系结构 350
本地动态SQL(NDS) 350
动态语句 351
带输入的动态语句 353
带输入和输出的动态语句 355
带未知数量的输入的动态语句 359
DBMS_SQL包 360
动态语句 362
带输入变量的动态语句 365
带输入和输出变量的动态语句 367
DBMS_SQL包定义 370
会话间通信 383
会话间通信简介 384
需要永久性或临时性的结构体 384
不需要永久性或临时性的结构体 384
比较会话间通信方法 385
DBMS_PIPE内置包 385
DBMS_PIPE包简介 385
DBMS_PIPE包的定义 387
DBMS_PIPE包的使用 391
DBMS_ALERT内置包 401
DBMS_ALERT包简介 401
DBMS_ALERT包的定义 402
DBMS_ALERT包的使用 404
外部过程 409
外部过程简介 410
使用外部过程 410
定义extproc的结构 410
定义extproc的Oracle Net Services配置 412
定义多线程的外部过程代理 419
13.2.4 使用C共享库 421
使用Java共享库 428
解决共享库的错误 432
侦听器或环境的配置 432
共享库或PL/SQL库包装器的配置 435
对象类型 437
对象基础知识 439
声明对象 440
实现对象主体 442
getter和setter 444
静态成员方法 446
比较对象 447
继承和多态 454
声明子类 455
实现子类 456
类型演变 459
实现集合对象主体 460
声明对象类型集合 460
实现对象类型集合 461
Java 库 465
Oracle 11g JVM的新功能 466
Java的体系结构 466
Java的执行控制 468
Java资源存储 468
Java类名 469
Java分解器 469
Java安全与权限 469
Java线程 469
Oracle的Java连接类型 469
客户端驱动程序或JDBC瘦驱动程序 469
Oracle调用接口驱动程序或中间层胖驱动程序 470
Oracle 服务器端内部驱动程序或服务器层胖驱动程序 470
在Oracle中创建Java类库 471
构建内部服务器Java函数 472
创建内部服务器Java过程 477
创建内部服务器Java对象 480
Java类库的故障检修 485
创建、加载和删除Java类库对象 485
使用Java类库对象 486
映射Oracle类型 488
Web应用程序开发 491
PL/SQL Web Server体系结构 493
Oracle HTTP Server体系结构 493
Oracle XML Database Server体系结构 494
配置独立Oracle HTTP服务器 496
描述mod_plsql模组 497
配置Oracle HTTP服务器 498
配置XML DB Server 500
配置静态身份验证 503
配置动态身份验证 504
配置匿名身份验证 504
比较支持Web的PL/SQL过程和PSP 506
创建支持Web的PL/SQL存储过程 507
开发不带形参的过程 509
开发带形参的过程 510
优缺点分析 515
构建和访问PL/SQL Server Page(PSP) 515
开发和运行不带形参的PSP过程 517
开发带形参的PSP过程 518
优缺点比较 522
Oracle数据库管理入门 525
Oracle数据库体系结构 526
启动和停止Oracle数据库 530
启动和停止Oracle侦听器 537
Oracle角色和权限 541
访问和使用SQL*Plus界面 542
Oracle数据库SQL入门 551
Oracle SQL*Plus数据类型 552
数据定义语言(DDL) 556
数据查询语言(DQL) 568
数据操纵语言(DML) 574
数据控制语句(DCL) 578
PHP技术入门 581
历史和背景 582
开发Web编程解决方案 583
Oracle数据库Java技术入门 633
Java和JDBC体系结构 634
配置Oracle Java环境 634
Java编程语言技术入门 636
测试客户端或瘦驱动程序JDBC连接 643
访问标量变量 648
写入和访问大对象 655
正则表达式入门 671
正则表达式简介 672
Oracle 11正则表达式实现 676
使用正则表达式 681
包装PL/SQL代码入门 687
包装PL/SQL的限制 688
使用wrap命令行实用程序 688
使用DBMS_DDL命令行实用程序 689
PL/SQL分层的配置文件入门 693
配置模式 694
收集配置文件数据 695
配置文件数据 698
使用plshprof命令行实用程序 702
PL/Scope 705
配置PL/Scope数据收集 706
查看PL/Scope收集数据 706
PL/SQL保留字和关键字 709
PL/SQL内置函数 717
字符函数 718
数据类型转换 724
错误报告 734
综合函数 736
  本书按PL/SQL的新增内容从前到后地安排章节。第1部分介绍了PL/SQL基本原理。第II部分介绍了编程语言的核心内容,包括函数、过程、包、触发器和大对象。第Ⅲ部分深入讨论一些高级主题,这些内容能很快地应用到您的开发项目中。.
  第Ⅳ部分的附录初步介绍了Oracle DBA任务、SQL编程、PHP脚本、Java开发、正则表达式以及包装PL/SQL。这部分还提供了PL/SQL Hierarchical Profiler(分层的配置文件)和PL/Scope的内容。附录I和附录J还分别回顾了支持编程任务的关键字和内置函数。
  0.1 第Ⅰ部分——PL/SQL基本原理
  第Ⅰ部分介绍了Oracle Database 10g Release 2的新功能及Oracle Database 11g的新功能。它提供了语言的快速指南,并介绍了语言语义、类型、控制结构和错误管理。
  ·第1章说明了PL/SQL的基础知识。还介绍了Oracle 10g Release 2的功能及Oracle 11g的新功能。
  ·第2章提供了编写PL/SQL的快速参考。它开始了对语言的介绍。
  ·第3章讲述了PL/SQL语言的语义。这一章涵盖了词汇单元、块结构、变量类型和变量作用域。
  ·第4章介绍了PL/SQL的条件和迭代结构。还介绍了语言中的游标(包括系统引用游标)和批操作。
  ·第5章介绍了如何在PL/SQL中进行错误管理。学习了如何处理异常、定义自定义异常和管理错误堆栈。
  0.2 第Ⅱ部分——PL/SQL编程
  第Ⅱ部分介绍了函数、过程、包和触发器。它还介绍了Oracle LOB。它们是构建健壮数据库应用程序的工具。
  ·第6章介绍了如何创建函数和过程。它提供了值传递和引用传递模型的示例,介绍了如何构建确定性函数、可并行的函数、管道函数和结果缓存函数。还介绍了调用语义,如位置、命名和混合表示法,以及自治程序单元。
  ·第7章介绍了VARRAY、嵌套表和联合数组(以前的PL/SQL表)。还介绍了集合API和集合操作符。该章中还包括对联合数组使用数字和字符串索引的示例。
  ·第8章介绍了大对象,演示了如何使用它们。其中的示例说明了如何从文件系统中读取它们和将它们写入数据库。还讲解了如何在PL/SQL或支持Web的应用程序中读写它们,以及通过Web页面和PHP脚本上传它们。
  ·第9章介绍了如何为相关函数和过程创建库。您将学习如何连续利用不可连续重用的包,如何实现定义者和调用者权限模型。该章中有一节介绍了如何查找、验证和描述数据目录中的包。您还将学习如何检查依赖性以及如何与签名验证方法比较和对照时间戳。
  ·第10章介绍了如何实现数据库触发器。其中的示例包括DDL触发器、DML触发器和复合触发器(Oracle Dambase 11g中的新内容)、instead-of触发器及系统或数据库事件触发器。这一章还包含一个完整示例,它使用支持数据库触发器的事件属性函数。
  0.3 第Ⅲ部分——PL/SQL高级编程
  第Ⅲ部分介绍了动态SQL、会话间通信、外部过程、对象类型、Java库和Web应用程序开发。..
  ·第11章介绍了如何使用NDS(NativeDynamicSQL,本地动态SQL)和老的DBMS_SQL包。该章的示例展示了如何用动态构建的语句(由新的DBMS ASSERT包审查)来调用程序。还可以看到使用占位程序或绑定变量的示例,包括创建占位程序动态列表的一个示例。
  ·第12章介绍了如何使用DBMS ALERT和DBMS PIPE在两个并发会话之间通信。
.  ·第13章介绍了如何使用外部过程,说明了如何在外部C和Java库中构建它们。本章还介绍了Oracle Heterogeneous Server以及如何配置listener.ora文件来支持外部过程。
  ·第14章介绍了如何定义和使用临时对象类型——这是使用包的另一种方式。您将学习如何创建对象类型和实现对象主体,及如何构建子类型。该章还介绍了如何查询和访问数据库表中的对象类型列。
  ·第15章介绍了如何在数据库中创建和部署Java库。它说明了PL/SQL包装器用作Java类方法的接口的原因和方式。还阐述了在Oracle 11g中与数据库通信的新方法。
  ·第16章介绍了如何编写支持Web的PL/SQL过程和PL/SQL Server Pages(PSPs)。该章还介绍了使用独立的Oracle HTTP Server和Oracle XML Database来配置和部署PL/SQL的Web解决方案。
  0.4 第Ⅳ部分——附录
  第Ⅳ部分包含了一系列的入门资料来帮助您快速了解新的Oracle或相关技术,包括Oracle,DBA任务、SQL编程、PHP脚本、Java开发、正则表达式和包装PL/SQL。还介绍了PL/SQL分层的配置文件、PL/Scope、保留字和一系列关键的内置函数。
  ·附录A介绍了如何使用SQL*Plus界面,如何打开和关闭数据库和Oracle侦听器。
  ·附录B开始介绍Oracle的SQL实现,首先是OracleSQL*Plus数据类型,然后是构建数据库应用程序所需的SQL语言命令:Data Definition Language(DDL)、Data Manipulation Language(DML)、Data Query Language(DQL)和Data Control Language(DCL)。
  ·附录C介绍了PHP的基本原理、Oracle的Zend Core的实现、以及如何对Oracle 11g数据库编写PHP Web页面。
  ·附录D介绍了Java编程语言的基本原理,讨论了Oracle 11g的Oracle.JDBC连接。还演示了如何构建和数据库(包括LOB)一起工作的独立的Java应用程序。
  ·附录E说明了Oracle 11g数据库中正则表达式的实现和使用。
  ·附录F介绍了如何包装PL/SQL存储程序来避免其逻辑被窥视。
  ·附录G介绍了Hierarchical Profiler的工作方式并作了演示。
  ·附录H介绍了其工作原理,提供了快速概念分析。
  ·附录I介绍了PL/SQL保留字和关键字,以及如何在数据目录中查找它们。
  ·附录J介绍了大量最有用的内置函数。它提供了使用这些函数的示例,本书的其他章节中也有引用。
  0.5 音像店示例
  本书大部分示例使用VideoStore模型,可从www.Oracle PressBooks.com网站上下载它(本书的所有源代码也可以从该网站或www.tupwk.com.cn/downpage上下载)。运行create_user.sq1脚本可创建本书中引用的p1sq1用户。可用create_store.sq1脚本构建该模型。另外,后一脚本为模型提供了基本数据来支持本书中的示例。...
...展开收缩
综合评分:4(49位用户评分)
下载个数:
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有39条
全部是源代码啊,还以为是书+代码呢
资料全面,节约了我不少工作量
代码比较齐全,不过书要另外下载
CruiseYoung
综合评分:
积分/C币:12
hellokidss
综合评分:
积分/C币:10
tony_wang0120
综合评分:
积分/C币:3
综合评分:
积分/C币:2
CruiseYoung
综合评分:
积分/C币:12
综合评分:
积分/C币:3
综合评分:
积分/C币:3
综合评分:
积分/C币:3
综合评分:
积分/C币:3
综合评分:
积分/C币:3
积分&29279
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
Oracle Database 11g PL/SQL程序设计--随书源代码
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
(仅够下载10个资源)
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
Oracle Database 11g PL/SQL程序设计--随书源代码如何使用 PHP 在 Oracle 中加密数据
作者:Larry Ullman
通过加密数据提高 Oracle 驱动的 PHP 应用程序的安全性。
本文相关下载:
2005 年 12 月发表
虽然存储和检索数据的过程是任何动态 Web 站点的核心,但对于专业的应用程序则需要投入比这些简单的事务更多的考虑和努力。数据存储的一个关键但容易被忽略的方面是使用加密来包含敏感信息 & 从口令到信用卡、社会保障号码等。因此,了解 Oracle 中提供了哪些加密方法(通过 PHP 接口)以及如何充分使用这些方法对所有 Web 开发人员来说都非常重要。
但它没有提供什么加密妙方。而是提供了许多选项,每种选项都有不同的安全级别、编程复杂度和性能开销。(通常在安全性和性能之间存在着反向关系)。在了解细节之前,您应认识到安全性并不只存在两个极端 & &安全&或&不安全& & 相反它是一个连续的分布,每个应用程序应当根据需求和上下文要求选择其中的一个级别。
在这篇方法文档中,将简要介绍一些必备的工具,还会提供一些具体的代码来提高数据的安全性。
首先,我们来介绍一些基本术语和概念。加密的过程是获取输入,用一个特定的密钥通过一种算法来处理它,然后返回加密的输出。算法的复杂度和密钥决定了特定加密的安全程度。您经常听到以
位 来描述加密:128 位、256 位等等。简而言之,使用了越多的位,算法也就越安全。
两种最基本的加密方法是
消息认证码(MAC,发音为 &mack&)。这两种方法都不加密或存储数据自身,而是存储数据经过数学计算后的表示。下面是它们的工作原理:
在散列法中,当用户注册一个网站的访问权时,他们将创建访问口令,而该口令的散列值将被存储在数据库中。当用户再次登录时,将把他们使用的口令的散列值与存储的散列值进行比较。如果两种散列值匹配,那么登录口令和注册口令就是相同的。对于 Oracle,您使用的两种最常见的散列算法是 MD5(128 位)和 SHA-1(160 位)。
MAC 将散列法和密钥一起使用,使得这个过程更加个性化,因此也更安全。
就数据库安全性而言,存储数据的散列值或 MAC 值是高效和有效的,但只有在您不需要存储数据本身时才有用。因此,对于信用卡、社会保障号码等信息都不能使用散列值或 MAC 值。
下一个级别就是真正的加密,它会改变数据本身。加密比散列法更复杂并且更具安全风险(因为您存储了某种形式的原始数据)。加密算法有很多种;数字加密标准 (DES) 是早期的加密算法之一,它只有 64 位,因此相对容易破解。几年前 DES 得到了改进,并重新发布为 Triple DES,也称为 DES3。最新且最好的方法是高级加密标准 (AES)。
与 MAC 类似,真正的加密使用密钥(一个字符串)。密钥应当为 RAW 数据类型,密钥中的字符数必须对应加密的位数。例如,128 位的 AES 使用 16 个字符的密钥(128 位除以每个字节 8 位等于 16 个字符)。因为加密数据与解密数据要使用完全相同的密钥,所以保护密钥是一个重要的安全性问题。
对于 Oracle,散列法是通过相应命名的
HASH() 函数实现的;MAC 则通过
MAC() 来计算;加密自然使用
ENCRYPT();解密使用
DECRYPT()。这些都定义在
dbms_obfuscation_toolkit (DOTK) 中。如果您在使用 Oracle 数据库 10g 或更高版本,那么
dbms_obfuscation_toolkit 已被
dbms_crypto 程序包所代替,它包含改进的特性,能够使用 BLOB 和 CLOB 数据类型,并支持(DOTK 不支持的)128 位、192 位或 256 位的 AES。要使用以下示例,需要安装这个程序包,并且您必须以在
dbms_crypto 上拥有
EXECUTE 权限的用户身份与 Oracle 连接。
这篇方法文档中的示例代码基于一个非常简单的表,可以使用以下 SQL 命令来创建它:
CREATE TABLE security (
data RAW(2000)
以下步骤将向您展示使用 Oracle 存储和检索该表中的加密数据所需的具体操作。由于重点是介绍函数加密,因此出于简洁性考虑,忽略了相关的一些概念(如错误管理和数据验证)。请查看 Oracle 获取更多详细信息。
第 1 步:使用 PL/SQL 创建加密/解密函数
我的第一个建议是使 Oracle 做尽可能多的工作。对于初学者,我强烈推荐定义处理加密的函数或存储过程。这么做有两个主要的好处:
由于 PL/SQL 函数隐藏了数据库中的安全性事务的具体细节,因此加密细节不会出现在纯文本的 PHP 脚本中
用户自定义的函数可以由该 Oracle 用户从任意 PHP 脚本中使用
清单 1 包含了这里将由 PHP 脚本使用的四个函数的定义。要在 Oracle 中创建它们,使用 PHP 脚本或 SQL*Plus(登录时采用和您使用 PHP 脚本时相同的用户身份)来运行清单 1 代码。这些函数都有注释,并使用相关函数的每个后续步骤中进行了详细说明。
/* Hash calculating function.
* Takes a string of data as its argument.
* Returns a hash in raw format.
CREATE OR REPLACE FUNCTION return_hash(data IN VARCHAR) RETURN RAW IS
/* Call HASH() function, which takes data in RAW format.
* Must use STRING_TO_RAW() to convert data.
* HASH_SH1 or HASH_MD5 are constants representing types of hashes to calculate.
RETURN DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW (data, 'AL32UTF8'), DBMS_CRYPTO.HASH_SH1);
/* MAC calculating function.
* Takes a string of data as its argument.
* Returns a hash in raw format.
CREATE OR REPLACE FUNCTION return_mac(data IN VARCHAR) RETURN RAW IS
/* Call MAC() function, which takes data in RAW format and key in RAW format.
* Must use STRING_TO_RAW() to convert data.
* HMAC_SH1 or HMAC_MD5 are constants representing types of hashes to calculate.
* Use 16-character key with 128-bit encryption.
* Function usage:
DBMS_CRYPTO.MAC(data AS RAW, HASH TYPE, key AS RAW)
return DBMS_CRYPTO.MAC(UTL_I18N.STRING_TO_RAW (data, 'AL32UTF8'),
DBMS_CRYPTO.HMAC_SH1, UTL_I18N.STRING_TO_RAW ('A1B2C3D4E5F6G7H8', 'AL32UTF8'));
/* Encryption function.
* Takes a string of data as its argument.
* Returns data in encrypted RAW format.
CREATE OR REPLACE FUNCTION return_encrypted_data(data IN VARCHAR) RETURN RAW IS
/* Define variables.
* key is the encryption key.
* encryption_mode identifies encryption algorithm and bit level
as well as and how chaining and padding are handled.
key VARCHAR(16) := 'A1B2C3D4E5F6G7H8';
encryption_mode NUMBER := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC
+ DBMS_CRYPTO.PAD_PKCS5;
/* Call ENCRYPT() function, which takes data in RAW format and key in RAW format.
* Must use STRING_TO_RAW() to convert data to RAW format.
* Use 16-character key with 128-bit encryption.
* Function usage:
DBMS_CRYPTO.ENCRYPT(data AS RAW, ENCRYPTION TYPE, key AS RAW)
RETURN DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW (data, 'AL32UTF8'),
encryption_mode, UTL_I18N.STRING_TO_RAW(key, 'AL32UTF8') );
/* Decryption function.
* Takes raw, encrypted data as its argument.
* Returns unencrypted data in string format.
CREATE OR REPLACE FUNCTION return_decrypted_data(data IN RAW) RETURN VARCHAR IS
/* Define variables.
* key is the encryption key.
* encryption_mode identifies encryption algorithm and bit level
as well as and how chaining and padding are handled.
key VARCHAR(16) := 'A1B2C3D4E5F6G7H8';
encryption_mode NUMBER := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC
+ DBMS_CRYPTO.PAD_PKCS5;
/* Call DECRYPT() function, which takes data in RAW format and key in RAW format.
* Must use STRING_TO_RAW() to convert data to raw.
* Must use CAST_TO_VARCHAR2() to convert RAW data to string.
* Use 16-character key with 128-bit encryption.
* Function usage:
DBMS_CRYPTO.DECRYPT(data AS RAW, ENCRYPTION TYPE, key AS RAW)
RETURN UTL_RAW.CAST_TO_VARCHAR2(DBMS_CRYPTO.DECRYPT
(data, encryption_mode, UTL_I18N.STRING_TO_RAW(key, 'AL32UTF8')));
第 2 步:将散列数据插入到数据库中
当您定义了执行加密的函数时,从 PHP 脚本中将加密数据存储在 Oracle 中将相当容易。
包含了一个将散列数据插入 security 表中的简单 PHP 脚本。要使用的函数被定义为:
CREATE OR REPLACE FUNCTION return_hash(data IN VARCHAR) RETURN RAW IS
RETURN DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW (data, 'AL32UTF8'), DBMS_CRYPTO.HASH_SH1);
该函数以一个字符串作为其唯一参数,并以 RAW 格式返回该字符串的一个散列版本。HASH() 函数自身有两个参数:散列化的字符串(RAW 格式)和一个指示要计算的散列类型的常量。UTL_I18N.STRING_TO_RAW() 函数(作为向 HASH() 函数提供的第一个参数的一部分调用)将把输入的字符串转换成 RAW 版本,而 HASH_SH1 是散列类型 (SHA-1)。假定您定义了这个函数,那么您可以在查询中使用它:
INSERT INTO security (data) VALUES (return_hash('$data'))
将这个查询放到一个插入记录的标准 PHP 脚本(清单 2)的上下文中就可以了!使用 $data 的不同值运行 PHP 脚本几次。(PHP 脚本假定您在运行 PHP 5 或更高版本,并且您已经正确设置了 Web 服务器的环境变量。)
&!DOCTYPE html PUBLIC &-//W3C//DTD XHTML 1.0 Transitional//EN&
&http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&&
&html xmlns=&http://www.w3.org/1999/xhtml& xml:lang=&en& lang=&en&&
&meta http-equiv=&content-type& content=&text/ charset=iso-8859-15& &//&
&title&Storing Hashed Values with PHP&/title&
&h3&Storing Hashed Values&/h3&
&?php # Listing 2
// Assumes that the environmental variables have been properly set.
// Data to be stored.
$data = 'This is the data.';
echo &&p&Data being handled:&b&$data&/b&&/p&\n&;
// Connect to Oracle.
// Assumes you are using PHP 5, see the PHP manual for PHP 4 examples.
$c = oci_pconnect ('scott', 'tiger', $sid) OR die
('Unable to connect to the database.ERROR:&pre&' . print_r(oci_error(),1) .'&/pre&&/body&&/html&');
// Define the query.
$q = &INSERT INTO security (data) VALUES (return_hash('$data'))&;
// Parse the query.
$s = oci_parse($c, $q);
// Execute the query.
oci_execute ($s);
// Report on the results.
$num = oci_num_rows($s);
if ($num & 0) {
echo '&p&The insert query worked!&/p&';
echo '&p&The insert query DID NOT work!&/p&';
// Close the connection.
oci_close($c);
// Query to confirm
the results:
// SELECT data FROM security
// SELECT * FROM security WHERE data=return_hash('$data')
然后在 SQL*Plus 中运行 SELECT 查询查看结果(图 1)。不过请记住,使用散列法是没有办法再查看原始数据的。
第 3 步:创建数据的 MAC 版本
这时,从 PHP 的角度看,将任何类型的加密数据插入到表中实质上都是一样的 & 只是调用适当的 PL/SQL 函数的问题。要用 MAC 值填充 security 表,可以使用
return_mac() 函数:
CREATE OR REPLACE FUNCTION return_mac(data IN VARCHAR) RETURN RAW IS
RETURN DBMS_CRYPTO.MAC(UTL_I18N.STRING_TO_RAW (data, 'AL32UTF8'),
DBMS_CRYPTO.HMAC_SH1, UTL_I18N.STRING_TO_RAW ('A1B2C3D4E5F6G7H8', 'AL32UTF8'));
同样,该函数以一个字符串作为其唯一参数,并以 RAW 格式返回该字符串的一个散列版本。这次将使用 MAC() 函数来执行加密。它有三个参数:散列化的字符串(RAW 格式)、一个指示要计算的散列类型的常量(HMAC_SH1,代表 SHA-1)和一个密钥。由于格式也是 RAW,因此必须将 UTL_I18N.STRING_TO_RAW() 函数应用到要加密的数据和密钥上。
正如我先前提到的,密钥的长度应当与加密的类型匹配 & 例如,一个 16 字符的密钥对应 128 位加密。密钥是由编程人员创建并硬编码到 PL/SQL 函数中去的(正如我在这篇方法文档中所演示的那样)。很明显应当保持它的机密性。
要将 MAC 值插入到表中,使用以下查询:
INSERT INTO security (data) VALUES (return_mac('$data'))
查看清单 3,获知执行该查询的 PHP 脚本:
&!DOCTYPE html PUBLIC &-//W3C//DTD XHTML 1.0 Transitional//EN&
&http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&&
&html xmlns=&http://www.w3.org/1999/xhtml& xml:lang=&en& lang=&en&&
&meta http-equiv=&content-type& content=&text/ charset=iso-8859-15& &//&
&title&Storing MAC Values with PHP&/title&
&h3&Storing MAC Values&/h3&
// Assumes that the environmental variables have been properly set.
// Data to be stored.
$data = 'This is the data.';
echo &&p&Data being handled:&b&$data&/b&&/p&\n&;
// Connect to Oracle.
// Assumes you are using PHP 5, see the PHP manual for PHP 4 examples.
$c = oci_pconnect ('scott', 'tiger', $sid) OR die
('Unable to connect to the database.ERROR:&pre&' . print_r(oci_error(),1) .'&/pre&&/body&&/html&');
// Define the query.
$q = &INSERT INTO security (data) VALUES (return_mac('$data'))&;
// Parse the query.
$s = oci_parse($c, $q);
// Execute the query.
oci_execute ($s);
// Report on the results.
$num = oci_num_rows($s);
if ($num & 0) {
echo '&p&The insert query worked!&/p&';
echo '&p&The insert query DID NOT work!&/p&';
// Close the connection.
oci_close($c);
// Query to confirm
the results:
// SELECT data FROM security
// SELECT * FROM security WHERE data=return_mac('$data')
第 4 步:使用 AES 加密
您将实践的下一件事是如何在 PHP 脚本中使用可恢复的加密方法 & 具体来说就是如何存储能够以非加密形式检索的加密值。为此提供的相关用户定义的函数是 return_encrypted_data:
CREATE OR REPLACE FUNCTION return_encrypted_data(data IN VARCHAR) RETURN RAW IS
key VARCHAR(16) := 'A1B2C3D4E5F6G7H8';
encryption_mode NUMBER := DBMS_CRYPTO.ENCRYPT_AES128 +
DBMS_CRYPTO.CHAIN_CBC
+ DBMS_CRYPTO.PAD_PKCS5;
RETURN DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW (data, 'AL32UTF8'),
encryption_mode, UTL_I18N.STRING_TO_RAW(key, 'AL32UTF8') );
该函数也以一个字符串作为其唯一参数,并以 RAW 格式返回该字符串的一个加密版本。不过,其内部工作方式要更复杂一些。使用 Oracle 的 ENCRYPT() 函数需要一些更复杂的语法,因此我将从定义两个变量开始,这两个变量将存储您可能在以后希望修改的特定值。查看 ENCRYPT() 函数本身,注意它的第一个参数是要加密的数据 & 当然是 RAW 格式。与 MAC() 函数一样,ENCRYPT() 使用一个密钥作为其第三个参数,该密钥将拥有与加密类型对应的适当长度,当然它也是 RAW 格式。
这里的第二个参数非常重要,它指定应当执行加密的具体类型。您可以通过添加特定的常量作为数字型值(存储在 encryption_mode 变量中)设置这个参数。这里,加密模式是 128 位 AES (ENCRYPT_AES128)& 使用 CHAIN_CBC 链接和 PAD_PKCS5 扩展。(关于&链接&和&扩展&的解释,请阅读本方法文档的结论中参考的文章。)
虽然这个函数可能看起来很复杂,但在查询中使用它仍然非常简单:
INSERT INTO security (data) VALUES (return_encrypted_data('$data'))
清单 4 包含了使用该查询的 PHP 脚本。您应当清空 security 表 (TRUNCATE TABLE security),然后使用不同的数据运行这个脚本几次来重新填充数据库。
&!DOCTYPE html PUBLIC &-//W3C//DTD XHTML 1.0 Transitional//EN&
&http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&&
&html xmlns=&http://www.w3.org/1999/xhtml& xml:lang=&en& lang=&en&&
&meta http-equiv=&content-type& content=&text/ charset=iso-8859-15& &//&
&title&Storing Encrypted Values with PHP&/title&
&h3&Storing Encrypted Values&/h3&
// Assumes that the environmental variables have been properly set.
// Data to be stored.
$data = 'This is the data.';
echo &&p&Data being handled:&b&$data&/b&&/p&\n&;
// Connect to Oracle.
// Assumes you are using PHP 5, see the PHP manual for PHP 4 examples.
$c = oci_pconnect ('scott', 'tiger', $sid) OR die
('Unable to connect to the database.Error:&pre&' . print_r(oci_error(),1) .'&/pre&&/body&&/html&');
// Define the query.
$q = &INSERT INTO security (data) VALUES (return_encrypted_data('$data'))&;
// Parse the query.
$s = oci_parse($c, $q);
// Execute the query.
oci_execute ($s);
// Report on the results.
$num = oci_num_rows($s);
if ($num & 0) {
echo '&p&The insert query worked!&/p&';
echo '&p&The insert query DID NOT work!&/p&';
// Close the connection.
oci_close($c);
// Query to confirm
the results:
// SELECT data FROM security
// SELECT * FROM security WHERE data=return_encrypted_data('$data')
在 SQL*Plus 中运行 SELECT 查询查看结果(图 1)。
第 5 步:使用 AES 解密
最后一步是以非加密的形式检索加密数据。为此提供的相应用户自定义的函数是
return_decrypted_data:
CREATE OR REPLACE FUNCTION return_decrypted_data(data IN RAW) RETURN VARCHAR IS
key VARCHAR(16) := 'A1B2C3D4E5F6G7H8';
encryption_mode NUMBER := DBMS_CRYPTO.ENCRYPT_AES128 +
DBMS_CRYPTO.CHAIN_CBC
+ DBMS_CRYPTO.PAD_PKCS5;
RETURN UTL_RAW.CAST_TO_VARCHAR2(DBMS_CRYPTO.DECRYPT
(data, encryption_mode, UTL_I18N.STRING_TO_RAW(key, 'AL32UTF8')));
该函数的运行稍有不同,它使用 RAW 数据作为其唯一参数并返回一个字符串。该函数调用 Oracle 的 DECRYPT() 函数,后者使用 RAW 数据作为其第一个参数(要解密的数据),解密模式作为其第二个参数,密钥作为其第三个参数。第二个和第三个参数的值必须与最早用来加密数据的参数值相同。
除了这种相反的行为之外,该函数可以和其他函数一样容易地在查询中使用。自然,您将在 SELECT 查询中使用这个函数:
SELECT return_decrypted_data(data) AS data FROM security
清单 5 从一个 PHP 脚本中运行这个查询,并使用一个循环打印检索到的记录。
&!DOCTYPE html PUBLIC &-//W3C//DTD XHTML 1.0 Transitional//EN&
&http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&&
&html xmlns=&http://www.w3.org/1999/xhtml& xml:lang=&en& lang=&en&&
&meta http-equiv=&content-type& content=&text/ charset=iso-8859-15& &//&
&title&Retrieving Encrypted Values with PHP&/title&
&h3&Retrieving Encrypted Values&/h3&
// Assumes that the environmental variables have been properly set.
// Data to be stored.
$data = 'This is the data.';
echo &&p&Data being handled:&b&$data&/b&&/p&\n&;
// Connect to Oracle.
// Assumes you are using PHP 5, see the PHP manual for PHP 4 examples.
$c = oci_pconnect ('scott', 'tiger', $sid) OR die
('Unable to connect to the database.Error:&pre&' . print_r(oci_error(),1) .'&/pre&&/body&&/html&');
// Define the query.
$q = &SELECT return_decrypted_data(data) AS data FROM security&;
// Parse the query.
oci_parse($c, $q);
// Execute the query.
oci_execute ($s);
// Fetch and print the returned results.
while (oci_fetch($s)) {
echo &&p&& . oci_result($s,'DATA') .&&/p&\n&;
// Close the connection.
oci_close($c);
// Query to confirm
the results:
// SELECT data FROM security
// SELECT * FROM security WHERE data=return_mac('$data')
正如您所看到的那样,使用 PHP 和 Oracle 执行加密不会很复杂。技巧是定义完成主要工作的 PL/SQL 函数。这种方法不仅使得 PHP 编码变得更容易,还且更加安全,这是因为使用的特定加密类型和密钥都被隐藏在 Oracle 内部。您可以通过为函数提供假脚本名称进一步隐藏其加密过程。
关于更多详细信息以及关于链接和扩展等的信息,请搜索 Oracle ACE 和安全专家 Arup Nanda 的文章。他在 && 中对加密的讨论非常精辟。在那篇文章中,Nanda 还讨论了您应当考虑的不同密钥管理理论,这是因为保护密钥是加密数据之安全性的关键。
关于 Oracle 中非 PHP 的加密,请阅读关于在 Oracle 数据库 10g 第 2 版中提供的 特性的信息。该技术可以快速自动地为您加密和解密数据(基于权限),同时将密钥安全地存储在服务器上的一个钱包文件中。
当然,对于数据库而言,最重要的安全性措施是正确管理数据库:限制访问,为用户设立相应的权限等。Oracle 数据库 10g 甚至添加了列级访问权限,它可以和已经提供的行级访问权限一起使用。
Larry Ullman 是
(该公司专门从事信息技术)的 Digital Media Technology 的主管和首席 Web 开发人员。Larry 居住在华盛顿特区周边,他还撰写了几本关于 PHP、SQL、Web 开发和其他计算机技术的书籍。
关于甲骨文
Integrated Cloud Applications & Platform Services

我要回帖

更多关于 php调用api接口实例 的文章

 

随机推荐