簡體   English   中英

具有Jasypt問題的浮動加密

[英]Float encryption with Jasypt issue

我需要加密浮點值,並且我正在使用Jasypt實現這一點。

據我所知,Jasypt不支持浮動加密,僅支持BigDecimal。 因此,我將浮點值轉換為BigDecimal。

轉換成功完成。 還使用Jasypt進行加密和解密。

但是,當我將加密的值持久保存到Oracle數據庫中時,該值將在數據庫中更改。

我需要保留的值示例如下:

-6542850164453273769179743775075308980128742113.12 -4139490689573544701682206282760323584523816140.64 9936653106931456268018508106437020093773774849.6 -69457501008740608752977363196163239676824308939.2 -51297435119059120242817505643912860445436

我在oracle中使用Number數據類型。

問題是,如何在不讓數據庫更改的情況下保存上述值?

數據庫總是從值中刪除(。)並加零

此值689612971966376606053641908553771273056281.427984保存為:-217333936122185596255723452297898520757000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

為什么會這樣?

您所依賴的是從數據庫中出來的數字與您輸入的數字完全相同 -盡管獲得確切的結果(就求反而言)對您來說似乎很奇怪,但我不是完全無法正常使用,這讓我感到非常驚訝。 您必須非常仔細地選擇數據庫類型,才能再次獲得准確的值-特別是,它必須具有與加密結果一樣高的精度。

還不清楚加密是否依賴於BigDecimal的規模(即1.0和1.00的表示不同)。 我不知道您是否會說服數據庫保存秤信息。

我強烈建議您使用更常規的加密機制-基本上是對二進制數據進行加密,將其存儲為某種類型的Blob,並將其從Blob解密為原始數據。 與執行浮點到定點轉換相比,在數據庫中存儲Blob時遇到細微的表示問題的可能性要小得多。

Java float是使用32位存儲空間的IEEE-754浮點數。

我們可以將這些位轉儲到一個方便的32位寬的Java int中,也可以將int轉換回float: Float.floatToIntBits()Float.intBitsToFloat()

注意int可以是正數或負數; 它的范圍為[-(2 31 ),(2 31 )-1]。

Jasypt提供了一種加密BigInteger的方法 ,因此我們可以將int轉換為BigInteger ,對其進行加密,然后將其存儲在數據庫中。

這是加密代碼的示意圖:

float x = (... my float value ...);
IntegerNumberEncryptor enc = (... an instance from somewhere ...);

int temp0 = Float.floatToIntBits(x);
BigInteger temp1 = BigInteger.valueOf(temp0);
BigInteger result = enc.encrypt(temp1);
(... store result in database ...)

以及解密代碼的草​​圖:

BigInteger input = (... get encrypted number from database ...)
IntegerNumberEncryptor enc = (... an instance from somewhere ...)

BigInteger temp0 = enc.decrypt(input);
int temp1 = temp0.intValue();
float result = Float.intBitsToFloat(temp1);
(... now do something with result ...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM