首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过加密/解密的Java代码

通过加密/解密的Java代码
EN

Security用户
提问于 2019-02-25 19:25:21
回答 1查看 643关注 0票数 -2

我想保存一个加密的密码(加密可能是手动生成的,也可以使用java代码,加密技术类型无关紧要),然后java代码将从文件中读取加密的密码并对其进行解密。

EN

回答 1

Security用户

发布于 2019-02-26 01:30:04

请求有人为您编写代码超出了此站点的范围。Java已经有了相当好的文档,如果您需要对它的一个特定方面的帮助,可以发布一个关于它的新问题(在这里,或者可能在StackOverflow上)。然而,我们可以提供建议,取决于你需要什么。这个答案有点笼统,因为你还没有给出太多的信息。

首先,一个一般性的忠告:如果可能的话,密码不应该存储在纯文本或可逆加密下。有明显的例外,例如密码管理器实用程序,但这些例外是由安全专家编写的,或者至少是与安全专家合作编写的。因为你不是其中之一,所以第一个要问自己的问题是:你真的需要能够存储和解密密码吗?

此外,像这样的系统的一般问题是“您从哪里获得解密密钥”?硬编码到应用程序中的密钥,或者存储在文件系统上的纯文本中的密钥,除了将密码(或任何秘密)存储在纯文本之外,并没有提供真正的额外安全性;能够访问密码文件的攻击者也可以访问密钥文件(或从二进制文件中提取密钥),并像应用程序一样使用该密钥解密密码。

下面是一些示例场景(其中一些是重叠的):

  1. 您正在构建一个身份验证系统,用户或其他程序需要通过向您发送密码来证明他们的身份。对于这种情况,您应该使用强大的密码散列算法,例如argon2 (如注释中提到的@Natanael ),并且不应该将密码存储在可逆加密下。
  2. 您正在构建一个客户端应用程序,并且不希望每次都让用户输入他们的密码。这里最好的选择是存储一个长期存在的会话令牌(或者可以用来更新会话令牌的刷新令牌),而不是存储密码本身。换句话说,当您提供密码时,不要存储密码,而是存储从服务器返回的东西。对于该服务上的用户而言,此令牌对于该计算机上的客户端(应用程序)是唯一的,因此它比存储密码更安全(该用户在该服务上、在任何客户端和任何计算机上都是如此),但是您可能希望以安全的方式存储它(请参见下面)。
  3. 您正在构建一个无人值守的服务,它需要能够进行身份验证,即使在任何时候都没有用户可以输入密码。如果你完全确定你需要这样做,那就继续阅读。
  4. 您正在存储一些秘密值(可能是密码,但希望是会话令牌或类似值),并且需要在没有用户交互的情况下检索它。首先,看看是否可以使用特定于平台的秘密存储系统。许多平台都提供了这样的方法,例如MacOS上的Keychain或Windows上的凭证管理器(不过,除非有人已经为本机代码接口编写了一个库,否则从Java访问这些服务可能比较困难)。在许多云平台(如AWS的密钥管理处 )上也有可用的秘密存储系统。如果由于某种原因这不是一个选项,那么在程序启动时,需要将密钥注入到程序的环境中,例如,作为环境变量或来自其他服务。当然,这只是“我应该把它存放在哪里?”询问一个级别,但可能您正在运行的环境有一个秘密存储的规定,即使您不能直接从您的代码访问它。
  5. 您希望使用用户提供的密钥或密码解密一个秘密(可能是密码,但可能不是)。如果用户直接提供密钥(例如,它在闪存驱动器上的文件中),只需将密钥读入内存足够长的时间来解密密钥,并将其存储在内存中即可。如果用户正在提供密码,请通过强大的密码散列/密钥派生函数(从文件中获取参数,如salt;它们不是秘密的)来运行密码,以生成密钥(只将密钥和密码本身存储在内存中,并且只在需要时保存),并使用上面提到的密钥。

有可能你只是不能有意义地保护秘密,因为没有地方可以存储密钥。在这种情况下,你运气不好,需要重新设计你的系统或者接受风险。您可以尝试将密钥与另一个密钥或二进制文件中硬编码的XOR掩码相结合,然后混淆二进制文件以减缓反向工程的尝试,但这并不是真正的安全性,就像减速是一道墙一样。(不要只在二进制文件中使用模糊密钥,因为如果不更新整个程序,它们就不能更改密钥。)

票数 1
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/204266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档