Шифрование с плавающей точкой с проблемой Jasypt - PullRequest
0 голосов
/ 30 июля 2011

Мне нужно зашифровать значения с плавающей точкой, и я использую Jasypt для этого.

Насколько я знаю, Jasypt не поддерживает шифрование с плавающей точкой и поддерживает только BigDecimal.Поэтому я конвертирую значения с плавающей точкой в ​​BigDecimal.

Преобразование выполнено успешно.Также шифрование и дешифрование с использованием Jasypt.

Однако, когда я сохраняю зашифрованное значение в БД Oracle, значение изменяется в БД.

Пример значений, которые мне нужно сохранить какэто:

-6542850164453273769179743775075308980128742113,12 -4139490689573544701682206282760323584523816140,64 9936653106931456268018508106437020093773774849,6 -69457501008740608752977363196163239676824308939,2 -512974351190591202428175056439128604458367,320048

Я использую номер типа данных в оракула

1014 * в questionis, как сохранить вышеуказанные значения без.разрешить БД изменять их?

БД всегда удаляет (.) из значения и добавляет нули

Это значение 689612971966376606053641908553771273056281.427984 сохраняется как -217333936122185596255723000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000случается

Ответы [ 2 ]

1 голос
/ 30 июля 2011

Вы полагаетесь на то, что число, полученное из базы данных, равно точно так же, как и число, которое вы вводите - и хотя для вас очень странно получать именно те результаты, которые вы получаете (с точки зрения отрицания) Я не совсем удивлен, что это не работает в целом.Вам нужно будет тщательно выбрать тип вашей базы данных действительно , чтобы снова получить точное значение - в частности, она должна иметь такую ​​же точность, что и результаты шифрования.

Это такжеНе ясно, зависит ли шифрование от масштаба BigDecimal (т. е. где 1,0 и 1,00 представлены по-разному).Я не знаю, будете ли вы убеждать базу данных в сохранении информации о масштабе.

Я бы настоятельно рекомендовал вам использовать более обычные механизмы шифрования - в основном шифровать двоичные данные, хранить их как какой-то большой двоичный объект.в базе данных, и расшифровать из BLOB-объекта до исходных данных.У вас гораздо меньше шансов столкнуться с тонкими проблемами представления при хранении большого двоичного объекта в базе данных, чем при преобразовании с плавающей запятой в фиксированную.

0 голосов
/ 02 августа 2011

Java float - это число с плавающей точкой IEEE-754, которое использует 32 бита хранилища.

Мы можем записать эти биты в Java int, которая обычно имеет ширину 32 бита, и мытакже можно преобразовать int обратно в число с плавающей точкой: 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 ...)
...