0

我需要加密浮点值,我正在使用 Jasypt 来实现这一点。

据我所知,Jasypt 不支持浮点加密,只支持 BigDecimal。因此,我将浮点值转换为 BigDecimal。

转换成功完成。还使用Jasypt进行加密和解密。

但是,当我将加密值保存到 Oracle 数据库中时,数据库中的值会发生变化。

我需要保持原样的值示例:

-6542850164453273769179743775075308980128742113.12 -4139490689573544701682206282760323584523816140.64 9936653106931456268018508106437020093773774849.6 -69457501008740608752977363196163239676824308939.2 -512974351190591202428175056439128604458367.320048

我在 oracle 中使用数字数据类型。

问题是,如何在不让数据库更改它们的情况下保存上述值?

数据库始终从值中删除 ( . ) 并添加零

此值68961297196666606060536419085553771273056281.427984被保存为:-21733333333333333333333121859621855555557000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000来00000000000000000000000000000000000000000000来00sy00000000 0000000000000000 y000000 y..y00小子

为什么会发生这种情况?

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 提供了一种加密BigIntegers的方法,因此我们可以将 s 转换int为 a 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 ...)
于 2011-08-02T16:52:51.963 回答