1. 程式人生 > >使用 Oracle的儲存過程實現資料加密和解密

使用 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