0

float 値を暗号化する必要があり、これを実現するために Jasypt を使用しています。

私の知る限り、Jasypt は float 暗号化をサポートしておらず、BigDecimal のみをサポートしています。したがって、浮動小数点値を BigDecimal に変換しています。

変換は正常に行われます。また、Jasypt を使用した暗号化と復号化。

ただし、暗号化された値を Oracle DB に永続化すると、DB で値が変更されます。

そのまま保持する必要がある値の例:

-6542850164453273769179743775075308980128742113.12 -4139490689573544701682206282760323584523816140.64 9936653106931456268018508106437020093773774849.6 -69457501008740608752977363196163239676824308939.2 -512974351190591202428175056439128604458367.320048

オラクルで Number データ型を使用しています。

問題は、DB に変更を許可せずに上記の値を保存する方法です。

DB は常に値から ( . ) を削除し、ゼロを追加します。

This value 689612971966376606053641908553771273056281.427984 is saved as: -217333936122185596255723452297898520757000000000000000000000000000000000000000000000000000000000000000000000000000000000000

なぜこれが起こるのですか?

4

2 に答える 2

1

データベースから出力される数値が、入力した数値とまったく同じであることに依存しています-そして、得ている結果を正確に取得することは非常に奇妙に思えますが(否定に関して)、私はそうではありませんそれが一般的に機能しないことに完全に驚いています。正確な値を再度取得するには、データベースの種類を慎重に選択する必要があります。特に、暗号化の結果と同じくらいの精度が必要です。

BigDecimalまた、暗号化が のスケール(つまり、1.0 と 1.00 の表現方法が異なる) に依存しているかどうかも明らかではありません。縮尺情報を保存するようにデータベースを説得するかどうかはわかりません.

より通常の暗号化メカニズムを使用することを強くお勧めします。基本的には、バイナリ データに暗号化し、データベースにある種の BLOB として保存し、BLOB から元のデータに復号化します。浮動小数点から固定小数点への変換を実行するよりも、データベースに BLOB を格納する際に微妙な表現の問題に遭遇する可能性ははるかに低くなります。

于 2011-07-30T07:41:49.777 に答える
-1

Javafloatは、32 ビットのストレージを使用する IEEE-754 浮動小数点数です。

intこれらのビットを便利な 32 ビット幅の Java にダンプできます。またint、浮動小数点数に変換することもできます: Float.floatToIntBits()Float.intBitsToFloat()

intは正または負の場合があることに注意してください。範囲は [−(2 31 ), (2 31 ) − 1] です。

Jasypt はsを暗号化BigIntegerする方法を提供するため、 を に変換しintBigInteger暗号化してデータベースに保存できます。

暗号化コードのスケッチは次のとおりです。

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 ...)
于 2011-08-02T16:52:51.963 に答える