V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  0xD800  ›  全部回复第 1 页 / 共 3 页
回复总数  48
1  2  3  
15 小时 41 分钟前
回复了 0xD800 创建的主题 Java 分享一个 Java 中非常糟糕的 API 设计
解决方案如下:

// 指定一个自定义的 Provider
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1", new PBEProvider());

// PBEProvider
public class PBEProvider extends Provider {
public PBEProvider() {
super("PBEProvider", 1.0, "MyProvider v1.0: Custom SecretKeyFactorySpi Implementation");
put("SecretKeyFactory.PBKDF2WithHmacSHA1", PBESecretKeyFactorySpi.class.getName());
}
}

// PBESecretKeyFactorySpi
public class PBESecretKeyFactorySpi extends SecretKeyFactorySpi {

String prfAlgo = "HmacSHA1";

@Override
protected SecretKey engineGenerateSecret(KeySpec spec) throws InvalidKeySpecException {
if (spec instanceof PBEKeySpec pksp) {
return new PBKDF2KeyImpl(pksp, this.prfAlgo);
} else {
throw new InvalidKeySpecException("Unsupported KeySpec");
}
}
// ...省略其他方法
}


// 自己实现一个 PBKDF2KeyImpl
// 重写 getPasswdBytes 方法
// 将每个 byte 直接转成 char 传入,然后再强转还原 byte[]即可
private static byte[] getPasswordBytes(char[] passwd) {
byte[] result = new byte[passwd.length];

for (int i = 0; i < passwd.length; i++) {
result[i] = (byte) passwd[i];
}

return result;
}


其中遇到一个问题,JDK 的 PBKDF2KeyImpl 里面有 CleanFactory ,搜了下好像是清理用的,我没处理这个直接注释了。
1 天前
回复了 0xD800 创建的主题 Java 分享一个 Java 中非常糟糕的 API 设计
@DefoliationM #43 很遗憾 不行的。。。
1 天前
回复了 0xD800 创建的主题 Java 分享一个 Java 中非常糟糕的 API 设计
@Rache1 说到这个我其实还是会点,至少对填充方式,一些数论基础,RSA 加解密原理,ECC 加解密原理都是熟悉的。
不过 IV 之类的了解还挺少,用的不多,我觉得也不难吧。

填充算法也简单。
1 天前
回复了 0xD800 创建的主题 Java 分享一个 Java 中非常糟糕的 API 设计
@yusheng88 #37
回复:
1. 上面有朋友发了 CPython 的实现,password 是允许字节流的
2. PBKDF 定义没看,但是可以参考#21 的回复,规范定义是字节流,只是建议用 ASCII 或 UTF8 序列
3. JDK 的类库我是研究了才发现这个奇葩的设计的呢

所以您有什么更好的解决方案吗?请指教。
另外我英文水平不是很好,无法直接阅读上面那些规范,自然不愿意去细读,那个网页的排版也差。
1 天前
回复了 0xD800 创建的主题 Java 分享一个 Java 中非常糟糕的 API 设计
@0o0O0o0O0o 哈哈 我并不是死磕,而是翻译代码的时候发现这个设计很奇葩,居然只允许用 char[],我用过其他的加密库都是允许传 byte[],这个操作我确实无法理解。😁
我开源过一个能满足基本 OA 的,就是代码写得很一般,你可以参考下:
演示地址: https://admin.l1yp.com/
前端: https://github.com/L1yp/van
后端: https://github.com/L1yp/van-app
,写得真的挺一般的,参考一二即可,也非常欢迎找我交流,知无不言~
支持,虽然我可能看不懂,但是表示支持😁
1 天前
回复了 0xD800 创建的主题 Java 分享一个 Java 中非常糟糕的 API 设计
@pkoukk #34 哈哈 挺无语的
1 天前
回复了 0xD800 创建的主题 Java 分享一个 Java 中非常糟糕的 API 设计
@geelaw 是的,输入法的问题,我想打的是嗝屁了
1 天前
回复了 0xD800 创建的主题 Java 分享一个 Java 中非常糟糕的 API 设计
@zzl22100048 是的👍
1 天前
回复了 0xD800 创建的主题 Java 分享一个 Java 中非常糟糕的 API 设计
@miaotaizi 上面的翻译代码其实是 AI 给我的,我 debug 看了,改动不大我都准备自己改下了
1 天前
回复了 0xD800 创建的主题 Java 分享一个 Java 中非常糟糕的 API 设计
@yippees 其实是你没看懂我上面的代码哦
2 天前
回复了 0xD800 创建的主题 Java 分享一个 Java 中非常糟糕的 API 设计
@geelaw
@orangie
感谢两位指正,我确实没有详细阅读。
2 天前
回复了 0xD800 创建的主题 Java 分享一个 Java 中非常糟糕的 API 设计
@AoEiuV020JP 哈哈 但是 python 有字符串啊,标准就是传字符串,java 设计出 char[]可能是防止字符串在常量池中,被扫出来吧
2 天前
回复了 0xD800 创建的主题 Java 分享一个 Java 中非常糟糕的 API 设计
@orangie 刚刚看了规范里面确实 P 和 S 都是 string ,这么说怪不得 Java 了,只能说其他语言太灵活了。
```text
Input: P password, an octet string
S salt, an octet string
```
2 天前
回复了 0xD800 创建的主题 Java 分享一个 Java 中非常糟糕的 API 设计
@InkStone 微信用的是这个 我也没办法. 我要解密就必须得用 单纯吐槽下这个 API 而已
2 天前
回复了 0xD800 创建的主题 Java 分享一个 Java 中非常糟糕的 API 设计
@gadfly3173 感谢回复,python 的 hashlib 中 password 是直接传入 bytes 的,不是传入 string ,因此没有转换的问题。而 java 是传入 UTF8 编码的字符数组,所以出现了问题,JAVA 底层还是把 char 转成了 byte[],我觉得这个设计不太合理,应该支持直接传入 byte[]好一些
2 天前
回复了 0xD800 创建的主题 Java 分享一个 Java 中非常糟糕的 API 设计
@orangie 真的非常感激你的回复,因为这个是解密微信的本地聊天记录数据库,所以没办法换加密方案,只能换个库或者自己实现这个 SPI 了。
2 天前
回复了 0xD800 创建的主题 Java 分享一个 Java 中非常糟糕的 API 设计
@siweipancc 一个计算微信聊天记录数据库密钥的算法,来源: https://mp.weixin.qq.com/s/4DbXOS5jDjJzM2PN0Mp2JA
2 天前
回复了 0xD800 创建的主题 Java 分享一个 Java 中非常糟糕的 API 设计
@lsk569937453 你说得对 0.0
1  2  3  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2236 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 30ms · UTC 07:48 · PVG 15:48 · LAX 00:48 · JFK 03:48
Developed with CodeLauncher
♥ Do have faith in what you're doing.