标签: jce

local_policy.jar和US_export_policy.jar与Unlimited Strength Vs Default不同.

在java平台文档http://www.oracle.com/technetwork/java/javase/jrereadme-182762.html中.关于评论

/lib/security/local_policy.jar /lib/security/US_export_policy.jar


无限强度Java密码学扩展

由于某些国家/地区的导入控制限制,Java SE Development Kit和Java SE Runtime Environment附带的Java Cryptography Extension(JCE)策略文件允许使用强大但有限的加密.

JDK网站上提供了这些文件的无限强度版本,表明对加密强度没有限制,适用于符合条件的国家/地区的用户.那些居住在符合条件的国家/地区的人可以下载无限强度版本,并使用无限强度文件替换强加密jar文件.问题

  1. 每个JDK包都附带local_policy.jar和US_export_policy.jar吗?
  2. 默认local_policy.jar和US_export_policy.jar的限制是什么.这是关键尺寸吗?
  3. 如果我需要使用128位密钥,则需要使用Unlimited Strength Java Cryptography
    Extension
  4. 有没有办法可以将这两个罐子保存在外部路径中并加载它.因为我有更多50台服务器而不是每台JDK,我宁愿将它保存在一个中心位置.

java linux jce

11
推荐指数
1
解决办法
4万
查看次数

我们如何将字符串从PEM转换为DER格式

从以下格式发送字符串:

-----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);

java cryptography jce

10
推荐指数
2
解决办法
2万
查看次数

线程"main"中的异常java.security.InvalidKeyException:非法的键大小或默认参数

下面的代码抛出此错误消息:

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)

java jce

10
推荐指数
1
解决办法
2万
查看次数

SUN JCE/Oracle JCE中的默认RSA填充

你能帮我指出什么是默认的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 cryptography jce

10
推荐指数
1
解决办法
4660
查看次数

NoSuchAlgorithmException:算法HmacSHA1不可用

看下面的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安装.

谷歌搜索了一下后,我设法通过做两件事来让它工作:

  1. sunjce_provider.jar$JAVA_HOME/jre/lib/ext容器的lib目录复制.
  2. 将以下行添加到我的代码中:

    java.security.Security.addProvider(new com.sun.crypto.provider.SunJCE());

具体来说,这发生在Apache James mailet中,但我很确定这与JVM选项有关.这是它使用的启动脚本.

虽然我最终得到了它的工作,但解决方案感觉太过黑了,不适合.我会很感激对正在发生的事情的解释,以及更"正确"的解决方案.

相关问题:使用Java加密导致NoSuchAlgorithmException.但是,在这种情况下,我非常确定应该支持开箱即用的HmacSHA1算法.作为证据,这在测试程序中没有问题.

java cryptography jce james

9
推荐指数
1
解决办法
1万
查看次数

如何使用AES和PBE的Bouncy Castle轻量级API

我有一块使用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)

java cryptography bouncycastle jce aes

9
推荐指数
2
解决办法
1万
查看次数

如何使用Android存储中的私钥

我正在尝试使用下一代码从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 eclipse android bouncycastle jce

9
推荐指数
1
解决办法
972
查看次数

限制JRE级别的密码套件

我们的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

java jce

9
推荐指数
1
解决办法
1万
查看次数

Java 1.7 + JSCH:java.security.InvalidKeyException:此算法的键太长

我正在尝试使用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 sftp jce jsch java-7

9
推荐指数
1
解决办法
4664
查看次数

AdoptOpenJDK 11 中的 JCE

Java Cryptography Extension (JCE) 可以在这里找到,但该页面说

当前版本的 JDK 不需要这些策略文件。此处提供它们是为了与旧版本的 JDK 一起使用。

JDK 9 及更高版本附带并默认使用无限制的策略文件。

这也适用于AdoptOpenJDK 11 吗?或者这仅限于 Oracle 的 JDK?我怎么知道它们可用?

jce adoptopenjdk

8
推荐指数
1
解决办法
7901
查看次数

标签 统计

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