Informix SQL에서 해시/체크섬을 계산하십시오
문제
Informix SQL의 열 값에 대한 일종의 해시 또는 체크섬 값을 계산하고 싶습니다.
문제 :
테스트 데이터에서 개인 정보를 익명화해야하며 다음과 같이 관련 값을 해싱하여 그렇게하고 싶습니다.
UPDATE personal_data SET name=HASH(name), employee_no=HASH(employee_no)
고정 값이 아닌 해시를 사용하려고합니다. 다른 값이 다른 결과에 (일반적으로) 다른 결과에 매핑되고 동일한 값이 동일한 결과에 매핑되는 데 유용하기 때문입니다. 따라서 여전히 테스트 데이터를 비교할 수 있습니다 (예 : 동일한 Employee_NO를 가진 여러 레코드를 가질 수 있으며 해당 정보를 보존하는 것이 유용합니다).
대부분의 DBM에는 일종의 해싱 기능이 있습니다 (PostgreSQL 및 MySQL에는 MD5 ()가 있고 Oracle은 dbms_utility.get_hash_value가 있지만 Informix에 대해서는 아무것도 찾을 수 없습니다 (Informix IDS 9). 누락 된 기능입니까?
해결책
ID에는 내장 함수 인 Afaicr로 노출 된 해시 기능이 없습니다.
IBM Informix Dynamic Server (IDS) 버전 10. 10.00을 사용한다고 가정하면 (이전 버전은 지원되지 않습니다. 정의 된 루틴) 작업을 수행합니다. 이것은 엄청나게 어렵지는 않지만 사소한 것도 아닙니다.
다른 팁
Sleske,
몇 년 전, 나는 SHA-1 해시를 계산하기 위해 T-SQL 기능을 작성했습니다. 그것이 당신을 위해 작동한다면, 당신은 정보를 위해 내 기능을 재 작업 할 수 있습니다. 이 뉴스 그룹 스레드 한계에 대한 정보가 조금 더 있습니다.
create function S(
@N int,
@x bigint
) returns binary(4) as begin
declare @two_N bigint
set @two_N = power(cast(2 as bigint), @N)
declare @two_32_N bigint
set @two_32_N = power(cast(2 as bigint), 32-@N)
return cast(@x%@two_32_N*@two_N + @x/@two_32_N as binary(4))
end
go
create function f(
@t bigint,
@B bigint,
@C bigint,
@D bigint
) returns bigint as begin
declare @2_32 bigint set @2_32 = power(cast(2 as bigint),32)
if @t between 0 and 19
return (@B & @C) | ((@2_32-@B-1) & @D)
if @t between 20 and 39
return @B ^ @C ^ @D
if @t between 40 and 59
return (@B & @C) | (@B & @D) | (@C & @D)
return @B ^ @C ^ @D
end
go
create function SHA1 (
@s varchar(55)
) returns binary(20) as begin
declare @b varbinary(55)
set @b = cast(@s as varbinary(55))
declare @zeros binary(64)
set @zeros = 0x
declare @padded binary(64)
set @padded =
@b + 0x80 + substring(@zeros,1,55-datalength(@b))
+ cast(8*datalength(@b) as binary(8))
declare @H5 binary(20)
set @H5 = 0x67452301EFCDAB8998BADCFE10325476C3D2E1F0
declare @K4 binary(16)
set @K4 = 0x5A8279996ED9EBA18F1BBCDCCA62C1D6
declare @ABCDE binary(20) set @ABCDE = @H5
declare @W80 varbinary(320) set @W80 = @padded
declare @TEMP binary(4) set @TEMP = 0x
declare @2_32 bigint set @2_32 = power(cast(2 as bigint),32)
declare @t int
set @t = 16
while @t < 80 begin
set @W80 = @W80 +
dbo.S(1,cast(substring(@W80,(@t-3)*4+1,4) as bigint)
^cast(substring(@W80,(@t-8)*4+1,4) as bigint)
^cast(substring(@W80,(@t-14)*4+1,4) as bigint)
^cast(substring(@W80,(@t-16)*4+1,4) as bigint))
set @t = @t + 1
end
set @t = 0
while @t < 80 begin
set @TEMP = cast((cast(dbo.S(5,substring(@ABCDE,1,4)) as bigint)
+ dbo.f(@t,substring(@ABCDE,5,4)
,substring(@ABCDE,9,4)
,substring(@ABCDE,13,4))
+ cast(substring(@ABCDE,17,4) as bigint)
+ cast(substring(@W80,4*@t+1,4) as bigint)
+ cast(substring(@K4,4*(@t/20)+1,4) as bigint))%@2_32 as
binary(4))
set @ABCDE = @TEMP+substring(@ABCDE,1,4)
+dbo.S(30,substring(@ABCDE,5,4))
+substring(@ABCDE,9,8)
set @t = @t + 1
end
set @H5
= cast((cast(substring(@H5, 1,4) as bigint) + cast(substring(@ABCDE, 1,4)
as bigint))% @2_32 as binary(4))
+ cast((cast(substring(@H5, 5,4) as bigint) + cast(substring(@ABCDE, 5,4)
as bigint))% @2_32 as binary(4))
+ cast((cast(substring(@H5, 9,4) as bigint) + cast(substring(@ABCDE, 9,4)
as bigint))% @2_32 as binary(4))
+ cast((cast(substring(@H5,13,4) as bigint) + cast(substring(@ABCDE,13,4)
as bigint))% @2_32 as binary(4))
+ cast((cast(substring(@H5,17,4) as bigint) + cast(substring(@ABCDE,17,4)
as bigint))% @2_32 as binary(4))
return @H5
end
당신이 사용할 수있는 Encrypt_tdes. 암호화 된 문자열은 원래보다 훨씬 길지만 문제가되지 않아야합니다. 값은 잘립니다. 암호화 + 잘림은 해시 값과 유사한 결과를 얻어야합니다. 암호화가 9.40에서 사용할 수 있는지 확실하지 않습니다. 이 경우 클라이언트의 해시 값을 계산해야합니다.
테이블 구조를 변경할 수 있다면 Vercols 옵션과 함께 사용할 수 있습니다. 보다 With Vercols 옵션 사용. 간단히 말해서 :이 옵션은 2 개의 추가 숨겨진 열 : 원래 삽입 된 행의 체크섬 및 행의 변경 수 (업데이트)를 제공합니다.