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
'programing' 카테고리의 다른 글
SQL 화학: 날짜 필드를 필터링하는 방법은 무엇입니까? (0) | 2023.07.19 |
---|---|
일 년 중 어느 분기에 날짜가 있는지 확인하는 기능이 있습니까? (0) | 2023.07.19 |
Grails3 파일 업로드 maxFileSize 제한 (0) | 2023.07.19 |
python numpy 시스템 엡실론 (0) | 2023.07.19 |
데이터베이스에서 jango 개체 다시 로드 (0) | 2023.07.19 |