小编Gan*_*nic的帖子

为什么我的pbkdf2实现如此缓慢(与SQLCipher相比)?

我在Xoom平板电脑上编写了一个简单的Android应用程序,它只是将一些字符串注释存储在SQLCipher数据库中.

系统会提示用户输入一个密码,该密码将由SQLCipher lib用于数据库.这个工作到目前为止很顺利.

现在我还实现了一个小的PBKDF2算法用于身份验证(事实上,我希望将来加密一些其他文件,不能存储在数据库中).但就目前而言,我只是来检查我的pbkdf2算法是否正确.我只使用了javax.crypto和java.security库.

代码段如下:

int derivedKeyLength = 128;
int iterations = 500;
KeySpec spec = new PBEKeySpec(passphrase.toCharArray(), salt, iterations, derivedKeyLength);
SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
byte[] derivedKey = f.generateSecret(spec).getEncoded();    
Run Code Online (Sandbox Code Playgroud)

salt是一个16字节的随机数,由SecureRandom生成.

所以我硬编码了密钥和盐,并比较了derivedKey进行身份验证(只是一个测试用例!)

我现在的问题是,在我的Xoom上它持续大约5秒直到派生函数完成,尽管迭代只设置为500.

AFAIK SQLCipher默认使用4000的迭代次数,如果密钥错误或正确,它会立即响应.(如果我将迭代设置为4000,则至少需要15秒)

问题是,我实现了效率低下还是因为SQLCipher性能良好(原生NDK函数等)?

提前谢谢ps:对不起,我的英语不是很棒!

编辑:

对不起,我不够清楚:-)

我知道PBKDF2应该是慢的(特定的迭代量,减慢暴力攻击),这正是我要求的原因!我想将迭代次数设置为5000(这是不可接受的,超过15秒)

我只是想知道因为,就像我说的那样,SQLCipher也使用PBKDF2(Iteration = 4k,而我使用的是500)从给定密码中获取密钥.我最后并没有谈论使用AES进行加密,而只是关于导出密钥的差异.

当然,SQLCipher的速度似乎比自制的keyderiving功能更快,但我不认为这会有太大的区别,因为SCLCipher的PBKDF2确实可以立即工作!

问候!

java android pbkdf2

7
推荐指数
2
解决办法
2725
查看次数

使用Android的证书进行SSL客户端身份验证

我正在编写一个Android应用程序,它连接到服务器以调用一些Web服务.此服务器使用自签名SSL证书,并需要客户端证书进行身份验证.

当我使用Android Chrome浏览器或使用Iphone的Safari浏览器连接到服务器时,它可以完美运行.SSL连接正在建立,客户端证书身份验证正在成功并重定向到我的Web服务.但是当我与其他浏览器连接时,例如股票android浏览器,海豚等,它会导致网络超时.

此外,当我连接我的Android应用程序时,我收到以下错误:

javax.net.ssl.SSLException: Read error: ssl=0x12746b8: I/O error during system call, Connection reset by peer
at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_read(Native Method)
at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:671)
at libcore.io.Streams.readSingleByte(Streams.java:41)
at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:655)
at libcore.io.Streams.readAsciiLine(Streams.java:201)
at libcore.net.http.HttpEngine.readResponseHeaders(HttpEngine.java:544)
Run Code Online (Sandbox Code Playgroud)

我关注了chariotsolutions的博客:http: //chariotsolutions.com/blog/post/https-with-client-certificates-on/

我还使用portecle GUI将客户端证书转换为BKS格式.

这是我的代码:

private static final String USER_AGENT = "Mozilla/5.0 (Linux; U; Android 4.0.3; et-ee; GT-P5100 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30";

....

@Override
protected Object doInBackground(String... urlString) {
    ....
    URL url = new URL(urlString[0]);
    HttpsURLConnection urlConnection =(HttpsURLConnection)url.openConnection();
    urlConnection.setSSLSocketFactory(getSSLContext().getSocketFactory());
    urlConnection.addRequestProperty("User-Agent", USER_AGENT);
    urlConnection.setDoInput(true);   
    urlConnection.connect();
    ....
} …
Run Code Online (Sandbox Code Playgroud)

authentication https android httpsurlconnection

7
推荐指数
0
解决办法
9531
查看次数