#javascript #node.js #encryption
#javascript #node.js #шифрование
Вопрос:
Я пытаюсь создать подпись для сгенерированного хэша. Прежде чем я сохраню данные в базе данных, VerifySignature возвращает true, таким образом, все хорошо. Прежде чем я сохраню подпись в БД, я конвертирую ее в JSON, потому что я не могу сохранить [Object объект]
router.post('/', function(req, res, next) {
var publicKey = '041e56b61d36fcef7942b671b1e9773bc105d7e5fb831f67d9004ddfb88b64cb522610d8efcebaf445794dc2f722fd53c1de92c3efe7fbb25ac9044715dd3632c8';
var privateKey = '704bc2b2e8d3f49ea6535498a82c4d09287c5f53acb4ebf1e55aca7e520c3f77';
var host = req.body.host;
var value = req.body.value;
var select = req.body.selectpicker;
var conncated = host.concat(value,select);
var message = Hash(conncated);
var signature = createSignature(message,privateKey);
var post = {
host: host,
type: select,
value: value,
signature: JSON.stringify(signature),
public : publicKey,
hash: message
};
var query = db.query('INSERT INTO diploma SET ?', post, function(err, result) {
});
const isVerified = verifySignature(message, publicKey, signature);
console.log('> Is verified: ', isVerified); //returns true
function verifySignature(message, publicAddress, signature) {
const messageHash = Hash(message);
const publicKeyPair = ec.keyFromPublic(publicAddress, 'hex'); // use the accessible public key to verify the signature
const isVerified = publicKeyPair.verify(messageHash, signature);
return isVerified;
}
function createSignature(message, privateKey) {
const messageHash = Hash(message);
const privateKeyPair = ec.keyFromPrivate(privateKey);
const signature = ec.sign(messageHash, privateKeyPair); // generate a signature on the hashed message with the private key
return signature;
}
});
Однако, когда я извлекаю данные обратно из базы данных, VerifySignature возвращает false. Я жестко запрограммировал открытый ключ и хэш, чтобы убедиться, что нет несоответствия кодировке.
router.get('/', function(req, res, next) {
var searchValue = req.query['hostname'];
var query = db.query('SELECT value,signature,hash,public FROM diploma WHERE host = ?', searchValue, function(err, result) {
var public = '041e56b61d36fcef7942b671b1e9773bc105d7e5fb831f67d9004ddfb88b64cb522610d8efcebaf445794dc2f722fd53c1de92c3efe7fbb25ac9044715dd3632c8';
var signature = JSON.parse(result[0].signature);
var hash = '81faaa9f6b615cae3d7d8aa39f2c02ef93f3ae20';
const isVerified = verify(hash,public,signature);
console.log('> Is verified: ', isVerified); //returns false
function verify(hash, publicAddress, signature) {
const publicKeyPair = ec.keyFromPublic(publicAddress, 'hex'); // use the accessible public key to verify the signature
const isVerified = publicKeyPair.verify(hash, signature);
return isVerified;
}
});
Что-то не так с сопоставлением mysql, потому что у меня заканчиваются идеи.
Комментарии:
1. У вас опечатка в строке const isVerified. У вас есть VerifySignature e (с двумя e).
2. Кроме того, вам ДЕЙСТВИТЕЛЬНО не следует публиковать здесь свою комбинацию открытого и закрытого ключей. Особенно никогда не делитесь своим закрытым ключом
3. Вы упускаете часть вашего второго примера? As
searchValue
нигде не определено4. это просто пример
Ответ №1:
Я понятия не имею, почему, но мне пришлось переключить функцию проверки на следующую, и теперь она работает.
function verify(hash, publicAddress, signature) {
const messageHash = Hash(hash);
const publicKeyPair = ec.keyFromPublic(publicAddress, 'hex'); // use the accessible public key to verify the signature
return publicKeyPair.verify(messageHash, JSON.parse(signature));
}