【发布时间】:2014-05-29 10:22:58
【问题描述】:
在发送到 PHP 应用程序之前,我尝试在 javascript 中对消息进行签名。 PHP 应用程序必须检查签名以确保它不是假的。
在 javascript 中,我使用 cryptico.js。
这是签名消息的js函数
var sign = function(passphrase, text) {
signingkey = cryptico.generateRSAKey(passphrase, 2048);
signString = cryptico.b16to64(signingkey.signString(text, "sha256"));
return signString;
}
这是获取公钥的函数:
var getPublicKey = function(passphrase) {
var rsaKey = cryptico.generateRSAKey(passphrase, 2048);
return = cryptico.publicKeyString(rsaKey);
}
例如,对于消息“message”和密码短语“test2”,公钥和签名是
QH / J3 / GVF / h5U02uPyC9Qzn / hHEV5DzB9nFfqk5zbQqHdInVe4sfL + NPA + 4fjLGrBU30Iuvcr + o9paEjzpH5dY48cq6JHqz1RyJ0CQIc2Jr5 + sS4eL1ZIjxWlyN1pKMR + 4aE2rlDAad56Ad1cytiaHuVvyK / gdtbKiuGroSQhJ1EVfZ60m3NIqnqmpi5Zdsnmzny4VH / d66BcGXxGaGaUaqFn0WTypuwIMZMMtzZEK7peKoaW4H4rfkfdrKcD8AaT + z9v5lLGkTl0NcZZ4LN9sSUzsHNfyAFK6cSXo / 73z0tDAlGb5K + yWV6UHoYW1rcoIsxlNRZM6 / 6FYgMXbbfow == P>
XbF4O6v6oadEQGtdpQ7d54Q2JB9 / ZEXEUH3S1FMn4E / PSqk7HLXjG4tNfuiUBa5eS8kYV49gwC8Yr + mn6YUAHt + K9lHPSsmltWoiHNOaas4aqai9nlyeft4TYYhP + GYbQfw + 3n2TcO39s6M0vw0m0a8AX9JfF02JwCUhP4bu4dzG6Bl5dj000TbUkric14Jyurp8OHmmMvKW62TvXPhNOW39 + wS1Qkfn9Bxmzi8UEVSVe3wP45JWZNgmgeGnpubDhD05FJEDErfVtZ / DRKD81q5YRd4X4cCkeDPDcJLgKW1jkCsA7yBqESXPDSkkrVUM06A9qMFUwk4mRI88fZ8ryQ == P>
我在问我如何在php中验证它?
我尝试了类似的东西:
$rsa = new Crypt_RSA();
$rsa->loadKey('qH/J3/gvF/h5U02uPyC9Qzn/hHEV5DzB9nFfqk5zbQqHdInVe4sfL+npa+4fjLGrBU30Iuvcr+o9paEjzpH5dY48cq6JHqz1RyJ0CQIc2Jr5+sS4eL1ZIjxWlyN1pKMR+4aE2rlDAad56Ad1cytiaHuVvyK/gdtbKiuGroSQhJ1EVfZ60m3NIqnqmpi5Zdsnmzny4VH/d66BcGXxGaGaUaqFn0WTypuwIMZMMtzZEK7peKoaW4H4rfkfdrKcD8AaT+z9v5lLGkTl0NcZZ4LN9sSUzsHNfyAFK6cSXo/73z0tDAlGb5K+yWV6UHoYW1rcoIsxlNRZM6/6FYgMXbbfow=='); // public key
echo $rsa->verify('message', 'XbF4O6v6oadEQGtdpQ7d54Q2JB9/ZEXEUH3S1FMn4E/PSqk7HLXjG4tNfuiUBa5eS8kYV49gwC8Yr+mn6YUAHt+K9lHPSsmltWoiHNOaas4aqai9nlyeft4TYYhP+GYbQfw+3n2TcO39s6M0vw0m0a8AX9JfF02JwCUhP4bu4dzG6Bl5dj000TbUkric14Jyurp8OHmmMvKW62TvXPhNOW39+wS1Qkfn9Bxmzi8UEVSVe3wP45JWZNgmgeGnpubDhD05FJEDErfVtZ/DRKD81q5YRd4X4cCkeDPDcJLgKW1jkCsA7yBqESXPDSkkrVUM06A9qMFUwk4mRI88fZ8ryQ==') ? 'verified' : 'unverified';
我认为签名和/或公钥的格式不适合 php。有什么想法吗?
提前谢谢你,
[编辑]
我不确定签名是否正确。如果我使用 js 函数cryptico.b64to16(signature),签名会有点像:
5db1783babfaa1a744406b5da50edde78436241f7f6445c4507dd2d45327e04fcf4aa93b1cb5e31b8b4d7ee89405ae5e4bc918578f60c02f18afe9a7e985001edf8af651cf4ac9a5b56a221cd39a6ace1aa9a8bd9e5c9e7ede1361884ff8661b41fc3ede7d9370edfdb3a334bf0d26d1af005fd25f174d89c025213f86eee1dcc6e81979763d34d136d492b89cd78272baba7c3879a632f296eb64ef5cf84d396dfdfb04b54247e7f41c66ce2f141154957b7c0fe3925664d82681e1a7a6e6c3843d3914910312b7d5b59fc344a0fcd6ae5845de17e1c0a47833c37092e0296d63902b00ef206a1125cf0d2924ad550cd3a03da8c154c24e26448f3c7d9f2bc9 P>
我不确定 $rsa->verify 的参数键的格式。我尝试添加前缀 ssh-rsa。但效果并不好。
所以我尝试了 to 签名格式和 to 密钥。消息每次都是“未验证”
【问题讨论】:
-
您知道每次调用
cryptico.generateRSAKey(passphrase, 2048)时,都会生成一个(希望)不同的 RSA 密钥,对吧? -
每次接缝都一样。我使用三个 JS 脚本/页面来测试 JS 中的库。一个用于生成公钥,一个用于签名,另一个用于验证。第一个我只给出密码,第二个给出密码和消息,第三个给出公钥、消息和签名。
-
如果 RSA 密钥生成函数(例程)总是返回相同的密钥,那么,不要使用它!除非您正在测试 PHP 脚本并且您绝对不关心 JS 部分,否则我强烈建议您更改库。 RSA 密钥必须尽可能随机。
-
可能是 IK 犯了一个错误,或者 crytico 不是一个好的库。
cryptico.generateRSAKey('test2', 2048).signString('message', "sha256");每次都是同一个签名。公钥的同上:cryptico.publicKeyString(cryptico.generateRSAKey('test2', 2048)); -
另外,通过阅读一些 Cryptico 代码,我也可以推断出编写它的人并不十分清楚她在做什么......
标签: javascript php rsa phpseclib cryptico