Как использовать информацию в маркере LTPA

Добавление моих 0,02$ для записи.

Моя работа включает разрабатывающие числовые модели, которые работают 100's гигабайтов данных. Тяжелые проблемы находятся в предложении генерирующего доход решения быстро (т.е. время выхода на рынок). Чтобы быть коммерчески успешным, решение также имеет к , выполняются быстро (вычислите решение за минимальное количество времени).

Для нас Python, оказалось, был отличным выбором разработать решения по причинам, обычно цитируемым: быстрое время разработки, выразительность языка, богатые библиотеки, и т.д. Но удовлетворять потребности скорости выполнения, мы приняли 'Гибридный' подход, который уже упомянули несколько ответов.

  1. Используя numpy для в вычислительном отношении интенсивных частей. Мы добираемся в 1.1x до 2.5x скорость 'собственного' решения C++ с numpy с меньшим количеством кода, меньшим количеством ошибок, и более короткое время разработки.
  2. Соление (сериализация объекта Python) промежуточное звено заканчивается для уменьшения перерасчета. Природа нашей системы требует, чтобы несколько переступили через те же данные, таким образом, мы 'запоминаем' результаты и снова используем их, если это возможно.
  3. Профилирование и выбор лучших алгоритмов. Это было сказано в других ответах, но я повторю его: мы хлещем cProfile и попытку заменить горячие точки лучшим алгоритмом. Не применимый во всех случаях.
  4. Движение к C++. Если вышеупомянутые сбои затем мы называем библиотеку C++. Мы используем PyBindGen для записи наших оберток Python/C++. Мы нашли это намного выше БОЛЬШОГО ГЛОТКА, SIP и Повышения. Python, поскольку это производит прямой Python C код API без промежуточного слоя.

Чтение этого списка Вы могли бы думать, "Что переделывает много из! Я просто сделаю это в [C/C ++/Java/assembler] в первый раз вокруг и буду сделан с ним".

Позволяют мне рассмотреть его в истинном свете. Используя Python мы смогли произвести рабочее генерирующее доход приложение через 5 недель, которые, на других языках, ранее потребовали 3 месяцев для проектов подобного объема. Это включает время, должен был оптимизировать части Python, которые мы нашли, чтобы быть медленными.

5
задан serg10 22 October 2009 в 17:52
поделиться

2 ответа

У вас нет прямого доступа к токену LTPA,

9
ответ дан 18 December 2019 в 08:29
поделиться

Заглядывание внутрь токенов LTPA отлично подходит для отладки, мы используем его много. Для работы вам понадобится ключ ltpa и пароль

/* Copyright notice
# Copyright (C) 2007, Cosmin Stejerean (http://www.offbytwo.com)
#
# You are free to use this code under the terms of the Creative Commons Attribution license
# available at http://creativecommons.org/licenses/by/3.0/
# so long as you include the following notice 'includes code from Cosmin Stejerean (http://www.offbytwo.com)'
*/

import java.security.Key;
import java.security.MessageDigest;
import java.security.spec.KeySpec;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.StringTokenizer;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;

import sun.misc.BASE64Decoder;


//The shared 3DES key is itself encrypted using the SHA hash value of the LTPA password (padded with 0x0 upto 24 bytes).

public class LtpaDecoder
{
    private String ltpa3DESKey = "JvJRzwdhKk6o40FuATa9acKD2uaXswVHlUsn2c2+MKQ=";
    private String ltpaPassword = "secretpassword";

    private String sUserInfo = "";
    private Date dExpiry;
    private String sFullToken = ""; 
    private String sSignature = "";

    public static void main(String[] args)
    {
          String tokenCipher = "vsof5exb990sb2r5hRJ+bneCnmBTuLQ3XF+......";

          try {
            LtpaDecoder t = new LtpaDecoder(tokenCipher);
            System.out.println("UserInfo: " + t.getUserInfo());
            System.out.println("Expiry: " + t.getExpiryDate());
            System.out.println("Full token: " + t.getFullToken());
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }

    public LtpaDecoder(String fulltoken) throws Exception {
        byte[] secretKey = getSecretKey(this.ltpa3DESKey, this.ltpaPassword);
        String ltpaPlaintext = new String(decryptLtpaToken(fulltoken, secretKey));

        extractTokenData(ltpaPlaintext);
    }

    private void extractTokenData(String token)
    {
        System.out.println("\n");
        StringTokenizer st = new StringTokenizer(token, "%");

        sUserInfo = st.nextToken();
        String sExpires = st.nextToken();
        sSignature = st.nextToken();
        dExpiry = new Date(Long.parseLong(sExpires));
        sFullToken = token;
    }

    public String getSignature() {
        return sSignature;
    }

    public String getFullToken() {
        return sFullToken;
    }

    public String getUserInfo() {
        return sUserInfo;
    }

    public String getExpiryDate() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
        return sdf.format(dExpiry);
    }

    private byte[] getSecretKey(String shared3DES, String password) throws Exception
    {
        MessageDigest md = MessageDigest.getInstance("SHA");
        md.update(password.getBytes());
        byte[] hash3DES = new byte[24];
        System.arraycopy(md.digest(), 0, hash3DES, 0, 20);
        Arrays.fill(hash3DES, 20, 24, (byte) 0);
        // decrypt the real key and return it
        BASE64Decoder base64decoder = new BASE64Decoder();
        return decrypt(base64decoder.decodeBuffer(shared3DES), hash3DES);
    }

    public byte[] decryptLtpaToken(String encryptedLtpaToken, byte[] key) throws Exception 
    {
        BASE64Decoder base64decoder = new BASE64Decoder();
        final byte[] ltpaByteArray = base64decoder.decodeBuffer(encryptedLtpaToken);
        return decrypt(ltpaByteArray, key);
    }

    public byte[] decrypt(byte[] ciphertext, byte[] key) throws Exception {
        final Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
        final KeySpec keySpec = new DESedeKeySpec(key);
        final Key secretKey = SecretKeyFactory.getInstance("TripleDES").generateSecret(keySpec);

        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        return cipher.doFinal(ciphertext);
    }
}
10
ответ дан 18 December 2019 в 08:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: