我使用BigIntegers来存储RSA加密的公钥和私钥。最近我发现字符串存储密码并不安全,因为它们是不可变的。BigIntegers也有同样的可卷性吗?目前我正在重构我的代码,以便在从应用程序的一个部分发送到另一个部分时,用户键存储在字符数组中,而不是字符串中。我需要知道从这些字符数组中生成BigInteger对象对用户数据是否安全,或者我是否需要更改应用程序的这部分功能。
mnemlml81#
你可以论证,byte[]比BigInteger更受欢迎,理由与char[]比String更受欢迎是一样的。作为背景知识,您应该阅读Jon Skeet's answer,它解释了为什么有些人推荐使用char[]而不是String来存储密码。简单地说,数组是可变的,可以在使用后被覆盖。理论上,这会立即从内存中删除敏感数据。同时,字符串只能由垃圾收集器从内存中删除。这意味着该值会在内存中停留一段时间,这可能是问题,也可能不是问题。像String一样,BigInteger是一个包含一个数组的对象,它阻止你改变这个数组。这意味着你不能自己清除这个数组,而必须等待垃圾收集器释放它。如果您认为这是一个问题,那么将密钥存储在字节数组中,并在使用后用零(或任何其他数据)显式覆盖数组是有意义的。至于这是否真的重要,我尊重linked question中现有的答案和注解。
byte[]
BigInteger
char[]
String
1条答案
按热度按时间mnemlml81#
你可以论证,
byte[]
比BigInteger
更受欢迎,理由与char[]
比String
更受欢迎是一样的。作为背景知识,您应该阅读Jon Skeet's answer,它解释了为什么有些人推荐使用
char[]
而不是String
来存储密码。简单地说,数组是可变的,可以在使用后被覆盖。理论上,这会立即从内存中删除敏感数据。同时,字符串只能由垃圾收集器从内存中删除。这意味着该值会在内存中停留一段时间,这可能是问题,也可能不是问题。像
String
一样,BigInteger
是一个包含一个数组的对象,它阻止你改变这个数组。这意味着你不能自己清除这个数组,而必须等待垃圾收集器释放它。如果您认为这是一个问题,那么将密钥存储在字节数组中,并在使用后用零(或任何其他数据)显式覆盖数组是有意义的。至于这是否真的重要,我尊重linked question中现有的答案和注解。