Форум программистов, компьютерный форум CyberForum.ru

Проверка валидности покупки сторонним сервером - Android

Восстановить пароль Регистрация
Другие темы раздела
Android HTML ссылки в Android http://www.cyberforum.ru/android-dev/thread1586975.html
Здравствуйте. Есть TextView, в который загружается HTML-код, в том числе и ссылки. Собственно по нажатию на ссылку она открывается в браузере (т.е. не в моем приложении). Вопрос 1: как отловить по какой ссылке перешел пользователь? (т.е. в TextView есть несколько ссылок, пользователь, например, перешел по ссылке "a", браузер открылся, но в мое приложение в какую-то переменную...
Android Ищу программиста в интересный фитнес проект Добрый день, необходимо разработать android приложение . Сейчас существует приложение на технологии 1c bitrix мобильное приложение (и серверная часть api готова ), к сожалению с ним работать без доступа в интернет нельзя. Поэтому встала задача сделать полностью нативное приложение которое может работать без интернета и при его появлении синхронизироваться с сервером. Описание задачи: Сам... http://www.cyberforum.ru/android-dev/thread1586970.html
Покупки, подписки в приложении Android
Использую библиотеку https://github.com/anjlab/android-inapp-billing-v3 Может кто использовал и знает ответы на мои вопросы?) 1) Как я понял список контента для продажи составляется при компиляции приложения? - SUBSCRIPTION ID, PRODUCT ID. А как быть если через некоторое время после публикации добавится еще что-то для продажи...? Или можно получить List контента для продажи из гугла? 2) У...
Android Поменять z-index
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/instruction" android:textSize="12dp" android:id="@+id/button24" android:background="@drawable/hbutton" android:layout_alignParentBottom="true" android:layout_alignLeft="@+id/button20" ...
Android Не обновлять айтемы в адаптере когда скроллим список http://www.cyberforum.ru/android-dev/thread1586817.html
Такая проблема, есть адаптер с чекбоксами, я выбираю чекбоксы, потом опускаю список ниже, подымаю его и эти чекбоксы снова сняты, как этого избежать? Что нужно писать внутри адаптера или что то поменять в списке? Не хочется выносить сетинг данных на фрагмент, хочется что бы все было внутри адаптера...
Android OnAttach(Activity) Deprecated Как реализовать передачу сообщений фрагмент - активити после того как onAttach(Actitivity) стал Deprecated (достали разрабы...) ? пробовал вот так- во фрагменте public interface onMainMenuListener { public void onButtonClickEvent(int i); } подробнее

Показать сообщение отдельно
ILNAR_93
Android
212 / 212 / 21
Регистрация: 19.01.2013
Сообщений: 1,528
Записей в блоге: 2
03.12.2015, 16:36  [ТС]     Проверка валидности покупки сторонним сервером
Проверка валидности посредством C#

Ответ от suvitruf
Когда приходит результат покупки, то в поле `inapp_signed_data` у `Intent`'а будет сигнатура.
Теперь вам нужен RSA. Для C# вам надо его сгенерировать из публичного ключа из вашей консоли разработчика в GP:

C#
1
2
3
const string MY_BASE64_PUBLIC_KEY = "Ваш base64 Google публичный ключ";
    RSACryptoServiceProvider provider = PEMKeyLoader.CryptoServiceProviderFromPublicKeyInfo(MY_BASE64_PUBLIC_KEY);
    string xmlPublicKey = provider.ToXmlString(false);
Вот класс для этого:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Security.Cryptography;
    using System.IO;
    
    namespace PublicKeyConvert
    {
        public class PEMKeyLoader
        {
    
            // encoded OID sequence for  PKCS #1 rsaEncryption szOID_RSA_RSA = "1.2.840.113549.1.1.1"
            static byte[] SeqOID = { 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00 };
    
            private static bool CompareBytearrays(byte[] a, byte[] b)
            {
                if (a.Length != b.Length)
                    return false;
                int i = 0;
                foreach (byte c in a)
                {
                    if (c != b[i])
                        return false;
                    i++;
                }
                return true;
            }
    
            public static RSACryptoServiceProvider CryptoServiceProviderFromPublicKeyInfo(byte[] x509key)
            {
                byte[] seq = new byte[15];
                int x509size;
    
                if (x509key == null || x509key.Length == 0)
                    return null;
                
                x509size = x509key.Length;
    
                // ---------  Set up stream to read the asn.1 encoded SubjectPublicKeyInfo blob  ------
                MemoryStream mem = new MemoryStream(x509key);
                BinaryReader binr = new BinaryReader(mem);    //wrap Memory Stream with BinaryReader for easy reading
                byte bt = 0;
                ushort twobytes = 0;
    
                try
                {
                    twobytes = binr.ReadUInt16();
                    if (twobytes == 0x8130) //data read as little endian order (actual data order for Sequence is 30 81)
                        binr.ReadByte();    //advance 1 byte
                    else if (twobytes == 0x8230)
                        binr.ReadInt16();   //advance 2 bytes
                    else
                        return null;
    
                    seq = binr.ReadBytes(15);       //read the Sequence OID
                    if (!CompareBytearrays(seq, SeqOID))    //make sure Sequence for OID is correct
                        return null;
    
                    twobytes = binr.ReadUInt16();
                    if (twobytes == 0x8103) //data read as little endian order (actual data order for Bit String is 03 81)
                        binr.ReadByte();    //advance 1 byte
                    else if (twobytes == 0x8203)
                        binr.ReadInt16();   //advance 2 bytes
                    else
                        return null;
    
                    bt = binr.ReadByte();
                    if (bt != 0x00)     //expect null byte next
                        return null;
    
                    twobytes = binr.ReadUInt16();
                    if (twobytes == 0x8130) //data read as little endian order (actual data order for Sequence is 30 81)
                        binr.ReadByte();    //advance 1 byte
                    else if (twobytes == 0x8230)
                        binr.ReadInt16();   //advance 2 bytes
                    else
                        return null;
    
                    twobytes = binr.ReadUInt16();
                    byte lowbyte = 0x00;
                    byte highbyte = 0x00;
    
                    if (twobytes == 0x8102) //data read as little endian order (actual data order for Integer is 02 81)
                        lowbyte = binr.ReadByte();  // read next bytes which is bytes in modulus
                    else if (twobytes == 0x8202)
                    {
                        highbyte = binr.ReadByte(); //advance 2 bytes
                        lowbyte = binr.ReadByte();
                    }
                    else
                        return null;
                    byte[] modint = { lowbyte, highbyte, 0x00, 0x00 };   //reverse byte order since asn.1 key uses big endian order
                    int modsize = BitConverter.ToInt32(modint, 0);
    
                    int firstbyte = binr.PeekChar();
                    if (firstbyte == 0x00)
                    {   //if first byte (highest order) of modulus is zero, don't include it
                        binr.ReadByte();    //skip this null byte
                        modsize -= 1;   //reduce modulus buffer size by 1
                    }
    
                    byte[] modulus = binr.ReadBytes(modsize);   //read the modulus bytes
    
                    if (binr.ReadByte() != 0x02)            //expect an Integer for the exponent data
                        return null;
                    int expbytes = (int)binr.ReadByte();        // should only need one byte for actual exponent data (for all useful values)
                    byte[] exponent = binr.ReadBytes(expbytes);
    
    
                    // ------- create RSACryptoServiceProvider instance and initialize with public key -----
                    RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
                    RSAParameters RSAKeyInfo = new RSAParameters();
                    RSAKeyInfo.Modulus = modulus;
                    RSAKeyInfo.Exponent = exponent;
                    RSA.ImportParameters(RSAKeyInfo);
    
                    return RSA;
                }
                finally
                {
                    binr.Close();
                }
            }
    
            public static RSACryptoServiceProvider CryptoServiceProviderFromPublicKeyInfo(String base64EncodedKey)
            {
                try
                {
                    //see if the file is a valid Base64 encoded cert
                    return CryptoServiceProviderFromPublicKeyInfo(Convert.FromBase64String(base64EncodedKey));
                }
                catch (System.FormatException)
                {
                }
    
                return null;
            }
    
            public static byte[] X509KeyFromFile(String filename)
            {
                byte[] x509key;
    
                if (String.IsNullOrWhiteSpace(filename) || !File.Exists(filename))
                    return null;
    
                StreamReader sr = File.OpenText(filename);
                String filestr = sr.ReadToEnd();
                sr.Close();
                StringBuilder sb = new StringBuilder(filestr);
                sb.Replace("-----BEGIN PUBLIC KEY-----", "");  //remove headers/footers, if present
                sb.Replace("-----END PUBLIC KEY-----", "");
    
                try
                {   
                    //see if the file is a valid Base64 encoded cert
                    x509key = Convert.FromBase64String(sb.ToString());
                }
                catch (System.FormatException)
                {       
                    //if not a b64-encoded publiccert, assume it's binary
                    Stream stream = new FileStream(filename, FileMode.Open);
                    int datalen = (int)stream.Length;
                    x509key = new byte[datalen];
                    stream.Read(x509key, 0, datalen);
                    stream.Close();
                }
    
                return x509key;
            }
    
        }
    }
Теперь можно проверять подпись сообщения:


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
 public static bool Verify(string message, string base64Signature, string xmlPublicKey){
        // Create the provider and load the KEY
        RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
        provider.FromXmlString(xmlPublicKey);
    
        // The signature is supposed to be encoded in base64 and the SHA1 checksum
        // of the message is computed against the UTF-8 representation of the message
        byte[] signature = System.Convert.FromBase64String(base64Signature);
        SHA1Managed sha = new SHA1Managed();
        byte[] data = System.Text.Encoding.UTF8.GetBytes(message);
    
        return provider.VerifyData(data, sha, signature);
    }
`message` - это ваш JSON.
 
Текущее время: 13:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru