使用 Oracle的儲存過程實現資料加密和解密
我們都知道,幾乎所有的資料庫都有儲存過程,但在實際開發中,它有什麼用途了?下面使用Oracle的儲存過程,採用Oracle自帶的dbms_obfuscation_toolkit.desencrypt對資料進行加密,需要注意的是密碼的長度必須為8的倍數,然後使用Java來呼叫這個儲存過程。
具體的實現例項:
一、建立一個加密和解密的儲存過程
第一步 建立表admin
create table admin(
ADMIN_ID number(10) primary key,
ADMIN_NAME varchar2(40) unique,
ADMIN_PWD varchar2(16) unique,
ADMIN_REALNAME varchar2(60),
ADMIN_EMAIL varchar2(60)
);
create sequence admin_seq;
第二步 插入資料
insert into admin values(admin_seq.nextval,'afeng','afeng1232323we23','陳徵峰','[email protected]');
select * from admin;
第三步 建立一個儲存過程對ADMIN_PWD進行加密
CREATE OR REPLACE PROCEDURE Encrypt_admin(adminNAME varchar2)
is
keyString VARCHAR2(8) := 'czfafeng';
encryptedString VARCHAR2(2048);
pwdString VARCHAR2(2048);
BEGIN
select ADMIN_PWD into pwdString
from admin
where ADMIN_NAME = adminNAME;
dbms_obfuscation_toolkit.desencrypt(
input_string => pwdString,
key_string => keyString,
encrypted_string => encryptedString);
update admin set ADMIN_PWD = encryptedString
where ADMIN_NAME = adminNAME;
commit;
END;
第四步 呼叫加密過程
begin
Encrypt_admin('afeng');
end;
第五步 建立一個儲存過程對ADMIN_PWD進行解密後寫入資料庫
CREATE OR REPLACE PROCEDURE decrypt_admin(adminNAME varchar2)
is
keyString VARCHAR2(8) := 'czfafeng';
decryptedString VARCHAR2(2048);
pwdString VARCHAR2(2048);
BEGIN
select ADMIN_PWD into pwdString
from admin
where ADMIN_NAME = adminNAME;
dbms_obfuscation_toolkit.DESDecrypt(
input_string => pwdString,
key_string => keyString,
decrypted_string => decryptedString);
update admin set ADMIN_PWD = decryptedString
where ADMIN_NAME = adminNAME;
commit;
END;
第六步 呼叫解密過程
begin
decrypt_admin('afeng');
end;
第七步 建立一個儲存過程對ADMIN_PWD進行解密,並輸出
CREATE OR REPLACE PROCEDURE decrypt_admin(adminNAME varchar2,decrypt_pwd out varchar2)
is
keyString VARCHAR2(8) := 'czfafeng';
decryptedString VARCHAR2(2048);
pwdString VARCHAR2(2048);
BEGIN
select ADMIN_PWD into pwdString
from admin
where ADMIN_NAME = adminNAME;
dbms_obfuscation_toolkit.DESDecrypt(
input_string => pwdString,
key_string => keyString,
decrypted_string => decryptedString);
decrypt_pwd:=decryptedString;
EXCEPTION
WHEN Others
-- NO_DATA_FOUND
THEN
decrypt_pwd:=trunc(DBMS_RANDOM.VALUE(1,200000)) ;
END;
第八步 呼叫解密過程
declare
pwd varchar2(40);
begin
decrypt_admin('afeng1',pwd);
dbms_output.put_line(pwd);
end;
二、Java呼叫儲存過程
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
import oracle.jdbc.OracleCallableStatement;
public class Produres_DES {
public static Connection conn;
public String sql;
static{
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","system","orcl");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catchblock
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catchblock
e.printStackTrace();
}
}
public void desDecrypt(){
@SuppressWarnings("resource")
Scanner input=new Scanner(System.in);
System.out.println("請輸入後臺管理員的使用者名稱:");
String username=input.next();
System.out.println("請輸入後臺管理員的密碼:");
String userpwd=input.next();
String sql2="{call decrypt_admin(?,?)}";
//生成一個執行過程的語句物件
OracleCallableStatement ocs;
try {
ocs = (OracleCallableStatement)conn.prepareCall(sql2);
ocs.setString(1, username);
ocs.registerOutParameter(2,java.sql.Types.VARCHAR);
ocs.execute();
String pwd=ocs.getString(2);
if(pwd.equals(userpwd)){
System.out.println("登入成功!");
}else{
System.out.println("登入失敗");
}
ocs.close();
} catch (SQLException e) {
// TODO Auto-generated catchblock
e.printStackTrace();
}
}
public void desEncrypt(){
String sql="insert into admin values(admin_seq.nextval,?,?,?,?)";
@SuppressWarnings("resource")
Scanner input=new Scanner(System.in);
System.out.println("請輸入後臺管理員使用者名稱:");
String username=input.next();
System.out.println("請輸入後臺管理員密碼(長度為8的倍數):");
String pwd=input.next();
System.out.println("請輸入後臺管理員的真實姓名:");
String name=input.next();
System.out.println("請輸入後臺管理員的郵箱:");
String email=input.next();
try {
PreparedStatement pstmt=conn.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, pwd);
pstmt.setString(3, name);
pstmt.setString(4, email);
pstmt.executeUpdate();
String sql2="{call Encrypt_admin(?)}";
//生成一個執行過程的語句物件
OracleCallableStatement ocs=(OracleCallableStatement)conn.prepareCall(sql2);
ocs.setString(1, username);
ocs.execute();
ocs.close();
System.out.println("插入資料和加密成功!");
} catch (SQLException e) {
// TODO Auto-generated catchblock
e.printStackTrace();
}
}
public static void main(String[] args) {
Produres_DES des=new Produres_DES();
//des.desEncrypt();
des.desDecrypt();
}
}
相關推薦
使用 Oracle的儲存過程實現資料加密和解密
我們都知道,幾乎所有的資料庫都有儲存過程,但在實際開發中,它有什麼用途了?下面使用Oracle的儲存過程,採用Oracle自帶的dbms_obfuscation_toolkit.desencrypt
用java實現簡易加密和解密
實現原理: 通過位運算的異或運算子“^”把字串與一個指定的值進行異或運算,從而改變字串中的每個字元的值,這樣就可以得到一個加密後的字串。傳送後再將加密後的字串通過源程式實現解
sqlserver儲存過程實現資料批量刪除--分割字串實現
寫的儲存過程,接收的引數的一個字串,通過分割字串從而實現批量刪除。 IF (@operation = 'delete') BEGIN DECLARE @temp nvarchar(200) DECLARE @splitchar nvarchar(1) SET
golang實現DES加密和解密
package main import ( "bytes" "crypto/des" "crypto/cipher" "fmt" ) func padding(src []byte,blocksize int) []byte { n:=len(src) pad
golang實現RSA加密和解密
package main import ( "crypto/rsa" "crypto/rand" "crypto/x509" "encoding/pem" "os" "fmt" ) func rsaGenKey(bits int) error { priva
Oracle 儲存過程 \ 遊標簡單定義和使用
-- Created on 2018/10/12 by 32580 declare -- 定義變數 變數賦值方式為: 變數名 := 值 i INTEGER ; sqls varchar2(500); user_id varchar2(36); l
PHP資料加密和解密
encrypt.php <?php /** * Passport 加密函式 * * @param string 等待加密的原字串 * @param
OCI 呼叫Oracle 儲存過程實現
OCI呼叫儲存過程 最近的風控框架開發中,遇到一個場景,即程式需要呼叫Oracle中的儲存過程,但是目前的框架中並不支援,只支援呼叫組裝好的SQL語句,即基本的資料庫增刪改查操作,這樣就需要開發OCI呼叫儲存過程。 基於這個需求,開始網上找尋資料。由於使用到
C#實現AES加密和解密函式
AES簡介 AES(The Advanced Encryption Standard)是美國國家標準與技術研究所用於加密電子資料的規範。它被預期能成為人們公認的加密包括金融、電信和政府數字資訊的方法。 AES 是一個新的可以用於保護電子資料的加密演算法。明確地說,AES 是
加密和解密(1):常用資料加密和解密方法彙總
資料加密技術是網路中最基本的安全技術,主要是通過對網路中傳輸的資訊進行資料加密來保障其安全性,這是一種主動安全防禦策略,用很小的代價即可為資訊提供相當大的安全保護。 一、加密的基本概念 "加密",是一種限制對網路上傳輸資料的訪問權的技術。原始資料(也稱為明文
通過oracle儲存過程實現使用者登陸驗證
1.建立使用者表: create table t_user( u_id number constraint pk_tuser primary key, u_name varchar2(15), u_pwd varchar2(20), sex varchar2(2) chec
Java實現Base64加密和解密
Base64是一種編碼格式,而不是演算法。 首先引入Base64類庫的maven依賴 <dependency> <groupId>com.xiaoleilu</groupId> <
Java實現AES加密和解密
/** * @param content * @return String * @Description:解密流程: * 1.同加密1-4步 * 2.將加密後的字串反紡成byte[]陣列 * 3.將加密內容解密 */ public stati
python 實現AES加密和解密
aes port 加密算 偏移量 blog utf-8 加密和解密 sda return 參考 https://blog.csdn.net/zhchs2012/article/details/79032656 AES加密算法是一種對稱加密算法, 他有一個密匙, 即用來加密,
Oracle儲存過程實現通過動態引數複製表
(作者:陳玓玏) 上一篇記錄的是通過自定義函式複製表的筆記,但是覺得過程還是有些麻煩。覺得還是用儲存過程更簡潔些,今天就把儲存過程的寫法整理出來了。下面程式碼用的時候記得把相應位置變數替換成你自己的。 --使用儲存過程複製表,使用儲存過程來複製表比使用自定義函式
Oracle 儲存過程實現批量插入
create or replace procedure BATCH_INSERT_TABLEA_UER(insertNo in integer) is -----------insertNo:傳入引
ASP.NET呼叫oracle儲存過程實現快速分頁
{ OracleConnection conn =new OracleConnection(ConfigurationSettings.AppSettings["OracleConnstr"].ToString()); OracleCommand cmd =new OracleCommand(); cmd.
MySQL 基於儲存過程 實現資料統計按日、周、月份統計模板
儲存過程developer_count 是根據傳入引數searchType 決定是使用那種查詢方式,本儲存過程中包含的其他的引數是{起始時間:startime,結束時間:endtime} CREATE PROCEDURE developer_count ( search
通過ios實現RSA加密和解密
在加密和解密中,我們需要了解的知識有什麼事openssl;RSA加密演算法的基本原理;如何通過openssl生成最後我們需要的der和p12檔案。 廢話不多說,直接寫步驟: 第一步:openssl來生成公鑰和私鑰證書,最後需要得到公鑰證書和私鑰證書。這是在mac OX系統
oracle儲存過程判斷手機號碼和固話
create or replace procedure get_Area_Phone(i_phoneNum in varchar2,--傳入號碼 o_phoneFlag