programing

Oracle에서 행의 sha1-hash

css3 2023. 7. 19. 21:32

Oracle에서 행의 sha1-hash

Oracle 데이터베이스에서 선택한 행의 sha1 해시를 만드는 데 문제가 있습니다.MSSQL에서 다음과 같이 수행했습니다.

SELECT *,HASHBYTES('SHA1',CAST(ID as varchar(10)+
  TextEntry1+TextEntry2+CAST(Timestamp as varchar(10)) as Hash
FROM dbo.ExampleTable
WHERE ID = [foo]

하지만 오라클과 작업할 때 사용할 수 있는 비슷한 기능을 찾을 수 없을 것 같습니다.내 구글링이 가져다 준 것으로 보아, 나는 dbms_crypto라고 추측합니다.hash_sh1과 관련이 있지만, 아직 머리를 싸매지 못했습니다.

어떤 조언이라도 해주시면 감사하겠습니다.

DBMS_CRYPTO 패키지가 해시를 생성하는 올바른 패키지입니다.기본적으로 PUBLIC에 부여되지 않습니다. 구체적으로 부여해야 합니다.GRANT EXECUTE ON SYS.DBMS_CRYPTO TO user1).

이 함수의 결과는 데이터 유형입니다.RAW당신은 그것을 저장할 수 있습니다.RAW열 또는 변환VARCHAR2사용RAWTOHEX또는UTL_ENCODE.BASE64_ENCODE기능들.

HASH함수가 오버로드되어 다음 세 가지 데이터 유형을 입력으로 수락합니다.RAW,CLOB그리고.BLOB암묵적 변환 규칙으로 인해 다음을 사용할 경우VARCHAR2입력으로 오라클은 변환을 시도할 것입니다.RAW이 변환은 16진수 문자열에서만 작동하기 때문에 실패할 가능성이 높습니다.

사용하는 경우VARCHAR2그런 다음 입력을 이진 데이터 유형으로 변환해야 합니다.CLOB예를 들어:

DECLARE
   x RAW(20);
BEGIN
   SELECT sys.dbms_crypto.hash(utl_raw.cast_to_raw(col1||col2||to_char(col3)), 
                               sys.dbms_crypto.hash_sh1) 
     INTO x 
     FROM t;
END;

의 문서에서 추가 정보를 찾을 수 있습니다.

DBMS_crypto 패키지는 varchar2를 지원하지 않습니다.raw type으로 작동하므로 varchar2가 필요하면 변환해야 합니다.다음은 이 방법을 보여주는 샘플 기능입니다.

declare
  p_string varchar2(2000) := 'Hello world !';
  lv_hash_value_md5    raw (100);
  lv_hash_value_sh1    raw (100);
  lv_varchar_key_md5   varchar2 (32);
  lv_varchar_key_sh1   varchar2 (40);
begin
  lv_hash_value_md5 :=
     dbms_crypto.hash (src   => utl_raw.cast_to_raw (p_string),
                       typ   => dbms_crypto.hash_md5);

  -- convert into varchar2
  select   lower (to_char (rawtohex (lv_hash_value_md5)))
    into   lv_varchar_key_md5
    from   dual;

  lv_hash_value_sh1 :=
     dbms_crypto.hash (src   => utl_raw.cast_to_raw (p_string),
                       typ   => dbms_crypto.hash_sh1);

  -- convert into varchar2
  select   lower (to_char (rawtohex (lv_hash_value_sh1)))
    into   lv_varchar_key_sh1
    from   dual;

  --
  dbms_output.put_line('String to encrypt : '||p_string);
  dbms_output.put_line('MD5 encryption : '||lv_varchar_key_md5);
  dbms_output.put_line('SHA1 encryption : '||lv_varchar_key_sh1);
end;

여기에 두자면, 누군가가 검색을 할 것입니다.

Oracle 12에서 사용할 수 있는 기능standard_hash(<your_value>, <algorythm>)기능.매개 변수 없음<algorythm>정의됨, SHA-1 해시를 생성합니다(출력 데이터 유형).raw(20))

이 기능은 utils_pkg에서 정의한 즐겨찾는 패키지에서 정의할 수 있습니다.

FUNCTION SHA1(STRING_TO_ENCRIPT VARCHAR2) RETURN VARCHAR2 AS 
BEGIN 
RETURN LOWER(TO_CHAR(RAWTOHEX(SYS.DBMS_CRYPTO.HASH(UTL_RAW.CAST_TO_RAW(STRING_TO_ENCRIPT), SYS.DBMS_CRYPTO.HASH_SH1))));
END SHA1;

자, 이제.

SELECT UTILS_PKG.SHA1('My Text') AS SHA1 FROM DUAL;

응답은

SHA1
--------------------------------------------
5411d08baddc1ad09fa3329f9920814c33ea10c0

일부 테이블에서 열을 선택할 수 있습니다.

SELECT UTILS_PKG.SHA1(myTextColumn) FROM myTable;

맛있게 드세요!

Oracle 19c:

select LOWER(standard_hash('1234')) from dual;

와 동등한.

select LOWER(standard_hash('1234','SHA1')) from dual;

SHA1 해시를 반환합니다.

대체 알고리즘은 https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/STANDARD_HASH.html 을 참조하십시오.

언급URL : https://stackoverflow.com/questions/1749753/making-a-sha1-hash-of-a-row-in-oracle