在java平台文档http://www.oracle.com/technetwork/java/javase/jrereadme-182762.html中.关于评论
/lib/security/local_policy.jar /lib/security/US_export_policy.jar
由于某些国家/地区的导入控制限制,Java SE Development Kit和Java SE Runtime Environment附带的Java Cryptography Extension(JCE)策略文件允许使用强大但有限的加密.
JDK网站上提供了这些文件的无限强度版本,表明对加密强度没有限制,适用于符合条件的国家/地区的用户.那些居住在符合条件的国家/地区的人可以下载无限强度版本,并使用无限强度文件替换强加密jar文件.问题
从以下格式发送字符串:
-----BEGIN RSA PUBLIC KEY-----
MIGHAoGBANAahj75ZIz9nXqW2H83nGcUao4wNyYZ9Z1kiNTUYQl7ob/RBmDzs5rY
mUahXAg0qyS7+a55eU/csShf5ATGzAXv+DDPcz8HrSTcHMEFpuyYooX6PrIZ07Ma
XtsJ2J4mhlySI5uOZVRDoaFY53MPQx5gud2quDz759IN/0gnDEEVAgED
-----END RSA PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)
如何从此字符串构造PublicKey对象?尝试了以下删除页眉和页脚和base64解码缓冲区
public static PublicKey getFromString(String keystr) throws Exception
{
//String S1= asciiToHex(keystr);
byte[] keyBytes = new sun.misc.BASE64Decoder().decodeBuffer(keystr);
X509EncodedKeySpec spec =
new X509EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePublic(spec);
}
Run Code Online (Sandbox Code Playgroud)
这可能会作为无效的密钥格式失败,也会失败
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException: algid parse error, not a sequence
at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:188)
at java.security.KeyFactory.generatePublic(KeyFactory.java:304)
at PublicKeyReader.getFromString(PublicKeyReader.java:30)
at Tst.main(Tst.java:36)
Run Code Online (Sandbox Code Playgroud)
密钥是通过openSSL的API生成的 PEM_write_bio_RSAPublicKey(bio, rsa);
下面的代码抛出此错误消息:
Exception in thread "main" java.security.InvalidKeyException: Illegal key size or default parameters
Cipher dcipher;
byte[] salt = new String("12345678").getBytes();
int iterationCount = 1024;
int keyStrength = 256;
SecretKey key;
byte[] iv;
Decrypter(String passPhrase) throws Exception {
SecretKeyFactory factory = SecretKeyFactory
.getInstance("PBKDF2WithHmacSHA1");
System.out.println("factory +" + factory);
KeySpec spec = new PBEKeySpec(passPhrase.toCharArray(), salt,
iterationCount, keyStrength);
System.out.println("spec " + spec);
SecretKey tmp = factory.generateSecret(spec);
System.out.println();
key = new SecretKeySpec(tmp.getEncoded(), "AES");
dcipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
}
public String encrypt(String data) throws Exception {
dcipher.init(Cipher.ENCRYPT_MODE, key); …Run Code Online (Sandbox Code Playgroud) 你能帮我指出什么是默认的RSA填充.
确切地说,如果我创建如下的密码实例,肯定java正在使用某种填充,因为加密的文本字节长度总是显示256字节的2048 RSA密钥,无论纯文本是一个字符还是10个字符.
Cipher.getInstance("RSA")
Run Code Online (Sandbox Code Playgroud)
如果在Cipher.getInstance("RSA")中没有指定填充,我想知道内部默认填充java使用的是什么.是PKCS#1 v 1.5?
谢谢,山姆
看下面的java行:
Mac.getInstance("HmacSHA1");
Run Code Online (Sandbox Code Playgroud)
如果我把它放在一个简单的测试程序中,它在我的服务器上运行没有问题.但是,如果我在容器中使用此行,我会得到
java.security.NoSuchAlgorithmException: Algorithm HmacSHA1 not available
at javax.crypto.Mac.getInstance(DashoA13*..)
Run Code Online (Sandbox Code Playgroud)
在这两种情况下都使用相同的JDK安装.
谷歌搜索了一下后,我设法通过做两件事来让它工作:
sunjce_provider.jar从$JAVA_HOME/jre/lib/ext容器的lib目录复制.将以下行添加到我的代码中:
java.security.Security.addProvider(new com.sun.crypto.provider.SunJCE());
具体来说,这发生在Apache James mailet中,但我很确定这与JVM选项有关.这是它使用的启动脚本.
虽然我最终得到了它的工作,但解决方案感觉太过黑了,不适合.我会很感激对正在发生的事情的解释,以及更"正确"的解决方案.
相关问题:使用Java加密导致NoSuchAlgorithmException.但是,在这种情况下,我非常确定应该支持开箱即用的HmacSHA1算法.作为证据,这在测试程序中没有问题.
我有一块使用JCE算法"PBEWithSHA256And256BitAES-CBC-BC"创建的密文.提供者是BouncyCastle.我想做的是使用BouncyCastle轻量级API解密这个密文.我不想使用JCE,因为这需要安装Unlimited Strength Jurisdiction Policy Files.
在使用BC与PBE和AES时,文档似乎很薄.
这是我到目前为止所拥有的.解密代码无例外地运行但返回垃圾.
加密代码,
String password = "qwerty";
String plainText = "hello world";
byte[] salt = generateSalt();
byte[] cipherText = encrypt(plainText, password.toCharArray(), salt);
private static byte[] generateSalt() throws NoSuchAlgorithmException {
byte salt[] = new byte[8];
SecureRandom saltGen = SecureRandom.getInstance("SHA1PRNG");
saltGen.nextBytes(salt);
return salt;
}
private static byte[] encrypt(String plainText, char[] password, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
Security.addProvider(new BouncyCastleProvider());
PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt, 20);
PBEKeySpec pbeKeySpec = new PBEKeySpec(password);
SecretKeyFactory keyFac …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用下一代码从Android系统存储中导入私钥:
PrivateKey privateKey = KeyChain.getPrivateKey(activity, alias);
Run Code Online (Sandbox Code Playgroud)
其中alias使用检索KeyChain.choosePrivateKeyAlias()方法.KeyChain.getPrivateKey不返回null但PrivateKey对象包含错误的键(所有重要字段都是null).我认为密钥不可导出,并尝试在下一个代码中使用它:
Cipher rsa;
rsa = Cipher.getInstance("RSA");
rsa.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] enc = rsa.doFinal(str.getBytes());
Run Code Online (Sandbox Code Playgroud)
但得到了来自BouncyCastle内部的NullPointerException.
带有密钥的证书是使用来自存储卡功能的Android标准负载从 PFX文件导入的.
我做错了什么?
UPD:我试过用不同的RSA证书做同样的事情,结果是一样的:(
我们的Java应用程序公开了许多不同的接口(SMTP,FTP,HTTP),由SSL/TLS保护.现在的目标是限制这些接口上允许的密码套件仅包括"强"密码套件.我已经有了一个列表,很清楚如何使它适用于特定的套接字
socket.setEnabledCipherSuites(ENABLED_SECURE_CIPHER_SUITES);
Run Code Online (Sandbox Code Playgroud)
或者用于Tomcat连接器
<Connector port="443" ciphers="..."/>
Run Code Online (Sandbox Code Playgroud)
问题是应用程序中已有5个位置我应该手动应用此限制.常见的SocketFactory似乎没有帮助,因为向第三方API或框架提供自定义SocketFactory并不总是可行的.是否有可能以某种方式在JRE级别上引入此限制,例如使用JCE提供程序配置或策略文件?
JRE:Oracle JRE 1.7.0_17
我正在尝试使用JSCH将文件上传到远程SFTP共享.每次我尝试从我的代码中连接到共享时,我都会得到一个看起来像这样的异常:
com.jcraft.jsch.JSchException: Session.connect: java.security.InvalidKeyException: Key is too long for this algorithm
at com.jcraft.jsch.Session.connect(Session.java:558) ~[jsch-0.1.51.jar:na]
at com.jcraft.jsch.Session.connect(Session.java:183) ~[jsch-0.1.51.jar:na]
Run Code Online (Sandbox Code Playgroud)
我在升级到Java 8时看过描述此错误的帖子,但我们仍然使用Java 7,而且我对Java的加密支持知之甚少,不知道这是否重要.
有些人建议安装JCE(Java Cryptography Extensions)来解决这个问题,所以我试了一下,但是在将相应的jar文件复制到/ libs/security目录并重新启动应用程序之后,我仍然会遇到同样的错误.我们确认通过执行此脚本安装了JCE,并注意到没有抛出异常.
我还尝试使用sftp详细模式下的命令从终端连接到远程SFTP共享.这是我得到的:
OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011
debug1: Reading configuration data /etc/ssh_config
debug1: /etc/ssh_config line 20: Applying options for *
debug1: /etc/ssh_config line 102: Applying options for *
debug2: ssh_connect: needpriv 0
debug1: Connecting to XXXXXXXXXXXXX [XXXXXXXXXXXX] port XX.
debug1: Connection established.
debug3: Incorrect RSA1 identifier …Run Code Online (Sandbox Code Playgroud) Java Cryptography Extension (JCE) 可以在这里找到,但该页面说
当前版本的 JDK 不需要这些策略文件。此处提供它们是为了与旧版本的 JDK 一起使用。
JDK 9 及更高版本附带并默认使用无限制的策略文件。
这也适用于AdoptOpenJDK 11 吗?或者这仅限于 Oracle 的 JDK?我怎么知道它们可用?
jce ×10
java ×9
cryptography ×4
bouncycastle ×2
adoptopenjdk ×1
aes ×1
android ×1
eclipse ×1
james ×1
java-7 ×1
jsch ×1
linux ×1
sftp ×1