网站运营公司,营销网站建设的步骤过程,祥云县住房和城乡建设局网站,网络营销好学吗总览 由于最近爱德华斯诺登 #xff08; Edward Snowden#xff09;发布了文件以及针对JC Penny #xff0c; Sony和Target等在线商业商店的黑客入侵#xff0c;安全性已成为近年来讨论的重要话题。 虽然本文不会为您提供帮助防止使用非法来源数据的所有工具#xff0c;但… 总览 由于最近爱德华·斯诺登 Edward Snowden发布了文件以及针对JC Penny Sony和Target等在线商业商店的黑客入侵安全性已成为近年来讨论的重要话题。 虽然本文不会为您提供帮助防止使用非法来源数据的所有工具但本文将为构建一套工具和策略提供起点以帮助防止其他方使用数据。 这篇文章将展示如何在Java环境中对字符串采用AES加密。 它将讨论如何创建AES密钥以及以JCEKS密钥库格式存储AES密钥。 此博客中的代码的工作示例位于https://github.com/mike-ensor/aes-256-encryption-utility 建议按顺序阅读每个部分因为每个部分都是上一个部分的基础但是您可能希望快速跳转到特定部分。 设置 –使用keytool设置和创建密钥 加密 –使用byte []密钥加密消息 解密 –使用相同的IV和加密密钥解密邮件 从密钥库获取密钥 –通过别名从密钥库获取密钥 什么是JCEKS JCEKS代表的J avaçryptographyËxtensionķEY 小号扯了下来这是针对Java平台的替代密钥库格式。 将密钥存储在KeyStore中可以作为一种措施以防止暴露您的加密密钥。 Java密钥库安全地包含可以由别名引用以在Java程序中使用的各个证书和密钥。 Java KeyStore通常是使用Java JDK随附的“ keytool ”创建的。 注意强烈建议为KeyStore创建复杂的密码以确保内容安全。 KeyStore是一个被认为是公共文件但是建议不要轻易访问该文件。 设定 所有加密均受每个国家/地区的法律管辖并且通常对加密强度有限制。 一个例子是在美国如果数据在边界外传输则所有128位以上的加密都受到限制。 默认情况下Java JCE实施强度策略以遵守这些规则。 如果首选更强的加密并遵守国家/地区的法律则JCE需要访问更强的加密策略。 简而言之如果您打算使用AES 256位加密则必须安装Unlimited Strength Jurisdiction Policy Files 。 如果没有适当的策略则无法进行256位加密。 安装JCE无限强度政策 这篇文章的重点是按键而不是JCE的安装和设置。 安装非常简单 可以在此处找到明确的说明注意这是针对JDK7的如果使用其他JDK则搜索适当的JCE策略文件。 密钥库设置 使用KeyTool时操作密钥库很简单。 必须使用指向新密钥的链接或在导入现有密钥库的过程中创建密钥库。 为了创建一个新的密钥和密钥库只需键入 keytool -genseckey -keystore aes-keystore.jck -storetype jceks -storepass mystorepass -keyalg AES -keysize 256 -alias jceksaes -keypass mykeypass重要标志 在上面的示例中这里是有关keytool参数的说明 密钥库参数 genseckey 生成SecretKey。 这是表示创建同步密钥的标志它将成为我们的AES密钥 keystore 密钥库的位置。 如果密钥库不存在该工具将创建一个新的存储器。 路径可以是相对的或绝对的但必须是局部的 storetype 这是商店的类型JCEPK12JCEKS等。 JCEKS用于存储证书中不包含的对称密钥AES。 storepass 与密钥库相关的密码。 强烈建议为密钥库创建一个强大的密码短语 关键参数 keyalg 用于创建密钥的算法AES / DES / etc keysize 密钥的大小128、192、256等 alias 给新创建的密钥的别名使用该密钥时要在其中引用 keypass 保护密钥使用的密码 加密 由于它涉及Java中的数据并且在最基本的级别上加密是一种算法过程该过程用于通过可逆过程以编程方式混淆数据双方都拥有与该数据有关的信息以及该算法的使用方式。 在Java加密中这涉及使用密码。 JCE中的Cipher对象是通常由算法选择的加密提供程序的通用入口点。 此示例使用默认的Java提供程序但也可以与Bouncy Castle一起使用。 生成密码对象 获得Cipher的实例非常容易并且加密和解密都需要相同的过程。 注意加密和解密需要相同的算法但不需要相同的对象实例 Cipher cipher Cipher.getInstance(AES/CBC/PKCS5Padding); 一旦有了密码实例就可以根据算法对数据进行加密和解密。 通常该算法将需要其他信息以便对数据进行加密/解密。 在此示例中我们将需要向算法传递包含密钥和初始向量的字节如下所述。 初始化 为了使用密码我们必须首先初始化密码。 此步骤是必需的因此我们可以为算法提供其他信息例如AES密钥和Initial Vector又名IV。 cipher.init(Cipher.ENCRYPT_MODE, secretKeySpecification, initialVector);参量 SecretKeySpecification是一个对象其中包含对构成AES密钥的字节的引用。 AES密钥无非是由密钥工具生成的见上文的特定大小的字节阵列256位的AES 256或32个字节。 替代参数 有多种创建密钥的方法例如包含盐用户名和密码或类似名称的哈希。 此方法将利用连接字符串的SHA1哈希转换为字节然后将结果截断为所需大小。 这篇文章不会显示使用此方法生成密钥或使用使用密码和密码的PBE密钥方法。 对于键输入密码和/或盐的使用是通过创建新的密钥的过程中使用的输入密钥工具处理。 初始化向量 AES算法还需要第二个参数即I信息化V扇区。 该过程中使用IV来使加密的消息随机化并防止密钥容易猜测。 IV被认为是公开共享的信息但同样不建议公开共享该信息例如将其发布在您公司的网站上是不明智的。 在加密消息时通常会在消息前加上IV因为基于算法IV的大小将为设定值/已知大小。 注意如果使用相同的IV密钥和消息则AES算法将输出相同的结果。 建议每次加密时随机创建IV。 使用新初始化的密码加密消息很简单。 只需致电 byte[] encryptedMessageInBytes Cipher.doFinal((message.getBytes(UTF-8));
String base64EncodedEncryptedMsg BaseEncoding.base64().encode(encryptedMessageInBytes);
String base32EncodedEncryptedMsg BaseEncoding.base32().encode(encryptedMessageInBytes);编码结果 字节数组很难可视化因为它们通常不会在任何字符集中形成字符。 解决此问题的最佳建议是用HEXbase-16 Double HEXbase-32或Base64格式表示字节。 如果将通过URL或POST参数传递消息请确保使用网络安全的Base64编码。 Google Guava库提供了出色的BaseEncoding实用程序 。 注意请记住在解密之前对编码的消息进行解码。 解密 解密消息几乎与加密过程相反只有少数例外。 与生成随机IV的加密过程不同解密需要一个已知的初始化向量作为参数。 解密 解密时请使用与加密方法相同的过程获得一个密码对象。 密码对象将需要利用完全相同的算法包括方法和填充选择。 一旦代码获得对Cipher对象的引用下一步就是初始化用于解密的密码并将对密钥和初始化向量的引用传递给它。 // key is the same byte[] key used in encryption
SecretKeySpec secretKeySpecification new SecretKeySpec(key, AES);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpecification, initialVector); 注意 密钥存储在密钥库中并通过使用别名获得 。 有关从密钥库获取密钥的详细信息请参见下文 一旦提供了密钥IV并为解密初始化了密码密码就可以执行解密了。 byte[] encryptedTextBytes BaseEncoding.base64().decode(message);
byte[] decryptedTextBytes cipher.doFinal(encryptedTextBytes);
String origMessage new String(decryptedTextBytes);保持静脉输液的策略 用于加密消息的IV对于解密消息很重要因此提出了一个问题即它们如何保持在一起。 一种解决方案是对IV进行基本编码请参见上文并将其添加到加密和编码的消息之前Base64UrlSafemyIv分隔符 Base64UrlSafeencryptedMessage。 其他可能的解决方案可能是上下文相关的例如在具有IV的XML文件中包括一个属性并为所使用的密钥提供别名。 从密钥库获取密钥 这篇文章的开头显示了创建引用密钥库数据库内部别名的新AES-256密钥有多么容易。 然后该帖子继续介绍如何在给定密钥的情况下加密和解密消息但是还显示了如何在密钥库中获取对该密钥的引用。 解 // for clarity, ignoring exceptions and failures
InputStream keystoreStream new FileInputStream(keystoreLocation);KeyStore keystore KeyStore.getInstance(JCEKS);
keystore.load(keystoreStream, keystorePass.toCharArray());if (!keystore.containsAlias(alias)) {throw new RuntimeException(Alias for key not found);
}Key key keystore.getKey(alias, keyPass.toCharArray());参量 keystoreLocation 字符串–本地密钥库文件位置的位置 keypass 字符串–使用keytool创建或修改密钥库文件时使用的密码请参见上文 alias String –使用keytool创建新密钥时使用的别名请参见上文 结论 这篇文章展示了如何使用AES-256加密算法对基于字符串的消息进行加密和解密。 加密和解密这些消息的密钥保存在使用JDK提供的“ keytool”实用程序创建的JCEKS格式的KeyStore数据库中。 这篇文章中的示例应被视为加密/解密对称密钥例如AES的坚实起点。 在加密消息例如密钥旋转时这不应被视为唯一的防线。 密钥轮换是一种减轻数据泄露风险的方法。 如果入侵者获取数据并设法破解单个密钥则多个文件中包含的数据应已使用多个密钥对数据进行加密从而降低了总暴露损失的风险。 该博客文章中的所有示例都被浓缩为一个简单的工具允许查看密钥库中的密钥JDK密钥工具不支持开箱即用的操作。 这篇文章中概述的步骤和主题的各个方面都可以从以下网址获得 https : //github.com/mike-ensor/aes-256-encryption-utility 。 注意示例示例代码和任何参考资料均由实施者自担风险没有任何默示的保证或责任您承担所有风险。 参考来自Mike站点博客上的JCG合作伙伴 Mike Ensor 提供的Java和JCEKS的AES-256加密 。 翻译自: https://www.javacodegeeks.com/2014/02/aes-256-encryption-with-java-and-jceks.html