JS RSA подписать с помощью заметок (шифрование, дешифрование, подпись, тест знака)

Вы будете пожинать:

  1. Как JS шифрования, дешифрования
  2. Как JS подпись, тест знак
  3. Js, как взаимодействовать друг с другом и Java для расшифровки, проверить знак (фокус)

По Google, обнаружил , что jsrsasignпользователи библиотек больше. Проверьте апите найти эту функцию библиотеки совершена. Как здесь используется метод представляет собой комбинацию интернет - резак печенья вещи, плюс мой собственный источник зрения суммируется.

  • Общий код:
  // 公钥
   let pk="-----BEGIN PUBLIC KEY-----\n" +
        "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD3XSdz1MnzazBEN5KOfTx0IyVJ\n" +
        "Z5wb57isrCuHDhnYXwtmdhQalgII0fozeeFpMpAvlnmHC1kpW7XVGvZnLx3bWbCE\n" + "bf+pMSW4kmQuI+5cxRUJbCl7sdaODBrINgERHPICVC18AJLThEVMHyjuR6Jn4zQm\n" + "yYNbReSktY/BrFTvMQIDAQAB\n" + "-----END PUBLIC KEY-----"; // 私钥 let priK = "-----BEGIN PRIVATE KEY-----\n" + "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAPddJ3PUyfNrMEQ3\n" + "ko59PHQjJUlnnBvnuKysK4cOGdhfC2Z2FBqWAgjR+jN54WkykC+WeYcLWSlbtdUa\n" + "9mcvHdtZsIRt/6kxJbiSZC4j7lzFFQlsKXux1o4MGsg2AREc8gJULXwAktOERUwf\n" + "KO5HomfjNCbJg1tF5KS1j8GsVO8xAgMBAAECgYEA6eG1JMrj63jEmStmMb1txG1a\n" + "mu4Q5z2QGgtr2HVXsIIlGEq6tWxyHf7TL4qkuz9onuYKn8n2Eqm44fZtVaBx+5ES\n" + "zRpIvlTvaxmVu0HZ1hYAzUw1XyRnXNMKpL5tT4GCjm8+QGPzlGxgXI1sNg8r9Jaw\n" + "9zRUYeA6LQR9RIMkHWUCQQD8QojjVoGjtiunoh/N8iplhUszZIavAEvmDIE+kVy+\n" + "pA7hvlukLw6JMc7cfTcnHyxDo9iHVIzrWlTuKRq9KWVLAkEA+wgJS2sgtldnCVn6\n" + "tJKFVwsHrWhMIU29msPPbNuWUD23BcKE/vehIyFu1ahNA/TiM40PEnzprQ5JfPxU\n" + "16S78wJANTfMLTnYy7Lo7sqTLx2BuD0wqjzw9QZ4/KVytsJv8IAn65P/PVn4FRV+\n" + "8KEx+3zmF7b/PT2nJRe/hycAzxtmlQJBAMrFwQxEqpXfoAEzx4lY2ZBn/nmaR/SW\n" + "4VNEXCbocVC7qT1j1R5HVMgV13uKiTtq8dUGWmhqsi7x3XayNK5ECPUCQQDZaAN6\n" + "tvIHApz9OLsXSw0jZirQ6KEYdharXbIVDy1W1sVE3lzLbqLdFp1bxAHQIvsYS5PM\n" + "A9veSJh372RLJKkj\n" + "-----END PRIVATE KEY-----"; // 原文 var src = "好厉害"; 

jsrsasign шифрование и дешифрование

шифрование

  1. Входящий PEM стандартная строка формата секретный ключ, секретный ключ порождающий экземпляр синтаксического анализа: RSAKey. Pem стандартный формат , содержащий ключи 开始标记и 结束标记, как здесь используется, клавиши: -----BEGIN xxx-----, -----END xxx-----. Что касается конкретного содержания не слишком важно , ххх, автоматически с помощью обычного кода чистка разворот и хвостовые знаки, так что на самом деле написанное -----BEGIN xxx-----не имеет значения .
  2. Позвоните encrypt, минуя открытый ключ и открытым текстом пример возвращает зашифрованное значение шестнадцатеричной строки символов .
  3. Таким образом, он должен быть преобразован в общую кодировку Base64. Если, для удобства на URL, рекомендуется использовать использование hextob64u(enc), он будет +заменить -, /заменить _, удалить хвост завершения =. Не рекомендуется , используя encodeURIComponentэту кодировку , будет больше расширить масштабы данных первоначального объема ( Base64 только увеличилось на треть, и шестнадцатеричной URL будет использоваться в два раза, конкретные причины может дополнительно Google ).

Дешифрирование

По существу, подобный процесс шифрования.

    // 加密
    // 读取解析pem格式的秘钥, 生成秘钥实例 (RSAKey) 
    var pub = KEYUTIL.getKey(pk);
    var enc = KJUR.crypto.Cipher.encrypt(src,pub);
// console.log(enc); // console.log(hextob64(enc)); // 解密 var prv = KEYUTIL.getKey(priK); var dec = KJUR.crypto.Cipher.decrypt(enc,prv); console.log("jsrsasign decrypt: "+dec); 

jsrsasign подпись и подписанный осмотр

Общий процесс

RSA проверки подписи для проверки основного потока, конечно, будут упакованы в два метода , чтобы получить: тест подписи и проверки
подписи :

  1. Укажите алгоритм дайджеста, например, sha1 хэш исходного текста.
  2. Хэш дайджест передней прокладки на идентификаторе алгоритма, идентифицирующий алгоритм, используемый для облегчения любого знака, когда тест.
  3. Вышеописанный хэш шифруется секретным ключом RSA.
  4. Заполните подпись.

Тест знак :

  1. Открытый ключ Rsa для расшифровки подписи, используемой для получения резюме.
  2. Возьмите оригинальное резюме.
  3. Краткое сравнение двух, а за подписью опыта, в противном случае он не проходит осмотр знак.

Используйте jsrsasign проверку проверки подписи

подпись

Многие сравнивают подобную информацию в Интернете, в момент подписания кода , чтобы открыть больше проблем.
Здесь мы, как правило , дается первый шаг. И, наконец, я смотрю на исходный код , чтобы упростить сводную вызов путь.

Метод 1: Создайте секретный ключ пример -> Build Signature пример -> ключи входящие, например, инициализация -> Подписи
    // 方式1: 先建立 key 对象, 构建 signature 实例, 传入 key 初始化 -> 签名
    var key = KEYUTIL.getKey(priK);
    console.log(key);
    // 创建 Signature 对象
    let signature=new KJUR.crypto.Signature({alg:"SHA1withRSA"}); // 传入key实例, 初始化signature实例 signature.init(key); // 传入待签明文 signature.updateString(src); // 签名, 得到16进制字符结果 let a = signature.sign(); let sign = hextob64(a); console.log(sign); 
Вариант 2: My упрощенным образом: на основании варианта осуществления 1, дисплей читать закрытый ключ будет удален, удалить шаг инициализации ( init(..))
    // 创建 Signature 对象
    let signature=new KJUR.crypto.Signature({alg:"SHA1withRSA",prvkeypem:priK}); //!这里指定 私钥 pem! signature.updateString(src); let a = signature.sign(); let sign = hextob64(a); console.log(sign); 

контрольное испытание

Обратите внимание, что точка зрения комментариев.

    // 验签
    // !要重新new 一个Signature, 否则, 取摘要和签名时取得摘要不一样, 导致验签误报失败(原因不明)!
    let signatureVf = new KJUR.crypto.Signature({alg:"SHA1withRSA",prvkeypem:pk}); signatureVf.updateString(src); // !接受的参数是16进制字符串! let b = signatureVf.verify(b64tohex(sign)); console.log("jsrsasign verify: "+b); 

jsrsasign и взаимодействовать с Java

Очень важно , чтобы любой JS простой в использовании плагин, и если Java не совместим, не годится. До этого через jsencrypt.jsбиблиотеки, но , казалось бы , несовместимые Java не найдено в чеке проверки подписи.

    // 解密Java的密文
    var prv = KEYUTIL.getKey(priK);
    // Java加密的密文(Base64Url)
    let encJava = "8S2KlcygY8eUvq_Dzro81IQd6oA5fxW9l9hsy8iOvtByMMJI1wKedO5sR_pJmJFYEZl6wfD4BQ-FzvSYftnO5xO8kJaHNtnrFE7R0mqpLIkf6aN02K4F9zWLad3emFTN8Ze_GqooVaa0oX6XHqpDFBQJF3kUB6cfS9mDJNq_boE"; // 解密 / Base64Url -> 16进制 / 私钥实例 var dec4Java = KJUR.crypto.Cipher.decrypt(b64utohex(encJava), prv); console.log("jsrsasign decrypt 4 java: "+dec4Java); // 验证Java的签名 // 构建Signature实例 // 这里 prvkeypem 放公钥pem看起来有点怪, 但是这是可行的, 内部还是使用的上文经常出现的 KEYUTIL.getKey(pk) 来生成公钥实例的 var sign4Java = new KJUR.crypto.Signature({alg:"SHA1withRSA",prvkeypem:pk}); sign4Java.updateString(src); // Java生成签名 var signByJava = "O6uEQFPPEmRfEiZcLQjMB7yYLpO2ohmCJvn95Izu8LveUWqFtoYJbvWRYwKCCV-Z3iurjpEw5nExvHQghwoYIxpB7p97G29WXWhfiaA0AUNlxDM2cOus-CIAq-Kyqee7vDsewp6ixaHThu0CxoPFGpBTpo5kuOFlPFR6CRS3Q9M"; var b2 = sign4Java.verify(b64utohex(signByJava)); console.log("jsrsasign verify 4 java: " + b2); 

Выполнить результаты этого тестового кода:

jsrsasign signing: O6uEQFPPEmRfEiZcLQjMB7yYLpO2ohmCJvn95Izu8LveUWqFtoYJbvWRYwKCCV+Z3iurjpEw5nExvHQghwoYIxpB7p97G29WXWhfiaA0AUNlxDM2cOus+CIAq+Kyqee7vDsewp6ixaHThu0CxoPFGpBTpo5kuOFlPFR6CRS3Q9M=
jsrsasign verify: true
jsrsasign decrypt: 好厉害
jsrsasign decrypt 4 java: 好厉害
jsrsasign verify 4 java: true 

Приложение: jsrsasign источник часть методы

Я хотел бы поговорить об источнике файле , прикрепленном к испытанию, но это , казалось бы , не поддерживает вложения, поэтому основную часть коды методы. Читая, с некоторыми комментариями, так апи кажется легче понять . Кроме того, этот метод вызываются на странице JS представил метод, использование других структур, можно было бы назвать несколько иначе, но ядро апи не меняется.

/**
 * 
 * @param l RSAKey / ECDSA / DSA / 标准的pem格式秘钥Base64字符
 * @param k
 * @param n
 * @returns {*} */ KEYUTIL.getKey = function (l, k, n) { var G = ASN1HEX, L = G.getChildIdx, v = G.getV, d = G.getVbyList, c = KJUR.crypto, i = c.ECDSA, C = c.DSA, w = RSAKey, M = pemtohex, F = KEYUTIL; ... // 这里通过判断pem结束标记来判断传入的是什么类型的秘钥字符 if (l.indexOf("-END PUBLIC KEY-") != -1) { var O = pemtohex(l, "PUBLIC KEY"); return F._getKeyFromPublicPKCS8Hex(O) } if (l.indexOf("-END RSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") == -1) { var m = M(l, "RSA PRIVATE KEY"); return F.getKey(m, null, "pkcs5prv") } ... 
/**
 *
 * @param {String} e 明文
 * @param {RSAKey} f 公钥
 * @param {String} d 算法名称, 大写, 如 RSA, 缺省 RSA
 * @returns {String} 16进制字符串 */ KJUR.crypto.Cipher.encrypt = function (e, f, d) { if (f instanceof RSAKey && f.isPublic) { var c = KJUR.crypto.Cipher.getAlgByKeyAndName(f, d); if (c === "RSA") { return f.encrypt(e) } if (c === "RSAOAEP") { return f.encryptOAEP(e, "sha1") } var b = c.match(/^RSAOAEP(\d+)$/); if (b !== null) { return f.encryptOAEP(e, "sha" + b[1]) } throw"Cipher.encrypt: unsupported algorithm for RSAKey: " + d } else { throw"Cipher.encrypt: unsupported key or algorithm" } }; 
/**
 *
 * @param {String} e 16进制密文字符串
 * @param {RSAKey} f 私钥
 * @param {String} d 算法名称, 大写, 如 RSA, 缺省 RSA
 * @returns {String} 明文 */ KJUR.crypto.Cipher.decrypt = function (e, f, d) { if (f instanceof RSAKey && f.isPrivate) { var c = KJUR.crypto.Cipher.getAlgByKeyAndName(f, d); if (c === "RSA") { return f.decrypt(e) } if (c === "RSAOAEP") { return f.decryptOAEP(e, "sha1") } var b = c.match(/^RSAOAEP(\d+)$/); if (b !== null) { return f.decryptOAEP(e, "sha" + b[1]) } throw"Cipher.decrypt: unsupported algorithm for RSAKey: " + d } else { throw"Cipher.decrypt: unsupported key or algorithm" } }; 
/**
 *
 * @param {Object}o o.alg:算法名称; o.prov:支持的js文件标识; o.prvkeypem:pem格式秘钥(base64);
 * @constructor
 */
KJUR.crypto.Signature = function (o) {
    var q = null; ... /**签名方法*/ this.sign = function () { ... } else { if (this.prvKey instanceof RSAKey && this.pubkeyAlgName === "rsa") { this.hSign = this.prvKey.signWithMessageHash(this.sHashHex, this.mdAlgName) ...

рекомендация

отwww.cnblogs.com/web-chuanfa/p/11096951.html