2017-03-23 3 views
-1

nvarchar 데이터 형식 열 (다른 언어로 된 텍스트 포함)이 포함 된 테이블이 있습니다. 레코드를 가져 오는 동안 테이블에 삽입하고 같은 암호를 해독하기 전에 데이터를 암호화하고 싶습니다.oracle에서 nvarchar 열을 암호화하는 방법?

어떻게하면 좋을지 제안 해주세요.

개인 키를 통해 암호화 및 암호 해독을 수행해야합니다.

호핑, 제 질문은 분명합니다. 자세한 정보를 제공해야하는지 확인하십시오.

+0

참조 : ([투명한 데이터 암호화를 사용하여 데이터 저장 데이터베이스 고급 보안 관리자 가이드/3 확보] https://docs.oracle.com/cd/B28359_01/network.111/b28530/asotrans.htm#g1011122)를 Oracle 도움말 센터에 게시하십시오. –

+0

@ OlivierJacot-Descombes 귀하의 제안에 감사드립니다. 표준 버전에서는 사용할 수 없으므로 투명 데이터 암호화를 사용할 수 없습니다. – Tajinder

답변

0

데이터베이스가 아닌 응용 프로그램에서 데이터를 직접 암호화하고 암호 해독하는 것이 좋습니다.

오라클의 DBMS_CRYPTO 패키지를 사용할 수 있습니다. 설명서 페이지 중간에 example이 있습니다.

먼저 SQL 표현식에서 암호 유형에 액세스하려면 패키지를 만들어야합니다. CBC 모드에서 패딩이있는 AES256을 원한다고 가정 해 보겠습니다.

CREATE PACKAGE pkg_so_42979606 
AS 
    FUNCTION cipher_type RETURN PLS_INTEGER; 
END pkg_so_42979606; 
/
CREATE PACKAGE BODY pkg_so_42979606 
AS 
    ctype CONSTANT PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES256 
            + DBMS_CRYPTO.CHAIN_CBC 
            + DBMS_CRYPTO.PAD_PKCS5; 
    FUNCTION cipher_type RETURN PLS_INTEGER 
    IS 
    BEGIN 
     RETURN ctype; 
    END; 
END pkg_so_42979606; 
/

그런 다음 키가 필요합니다. Oracle에 생성하도록 요청할 수 있습니다. 쉽게 처리하기 위해 Base64로 옮길 것입니다. 의 하나를 그려 보자 : 내가 사용하는 것

DECLARE 
    key_bytes_raw RAW(32); 
    key_char NVARCHAR2(64); 
BEGIN 
    key_bytes_raw := DBMS_CRYPTO.RANDOMBYTES(32); 
    key_char := UTL_I18N.RAW_TO_CHAR(UTL_ENCODE.BASE64_ENCODE(key_bytes_raw), 'AL32UTF8'); 
    DBMS_OUTPUT.PUT_LINE('Key: ' || key_char); 
END; 
/
Key: pMV3D4xhyfNxp3YyfLWzAErGcKkIjK3X6uc/WIeVTls= 

따라서 암호 키가 pMV3D4xhyfNxp3YyfLWzAErGcKkIjK3X6uc/WIeVTls=입니다.

은 지금 당신은 암호화 된 데이터를 삽입 할 수있는 테스트 테이블을

CREATE TABLE so_42979606 (
    id NUMBER PRIMARY KEY, 
    data NVARCHAR2(2000)); 

를 사용합니다 :

INSERT INTO so_42979606 
    VALUES (1, 
      DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW('My clear data', 'AL32UTF8'), 
           pkg_so_42979606.cipher_type(), 
           UTL_ENCODE.BASE64_DECODE(UTL_I18N.STRING_TO_RAW('pMV3D4xhyfNxp3YyfLWzAErGcKkIjK3X6uc/WIeVTls=', 'AL32UTF8')))); 

을 지우기에 암호화 된 데이터를 검색 할 수 있습니다.

SELECT id, UTL_I18N.RAW_TO_NCHAR(DBMS_CRYPTO.DECRYPT(data, 
            pkg_so_42979606.cipher_type(), 
            UTL_ENCODE.BASE64_DECODE(UTL_I18N.STRING_TO_RAW('pMV3D4xhyfNxp3YyfLWzAErGcKkIjK3X6uc/WIeVTls=', 'AL32UTF8'))), 
           'AL32UTF8') data 
    FROM so_42979606; 

ID DATA 
-- ---------------------- 
1 My clear data 
+0

시간 내 주셔서 감사합니다. 다른 언어 텍스트와 함께 nvarchar 열을 사용할 때 잘못된 데이터'???'를 반환합니다. – Tajinder

+0

@Tajinder 나는 완전한 예를 추가하기 위해 편집했다. 희망이 도움이됩니다. – kmkaplan

+0

또한'RAW' 컬럼에 데이터를 저장하는 요구 사항을 완화하면'UTL_I18N' 캐스팅을 저장합니다. – kmkaplan