I found a reference to the HMAC encryption. I’m thinking that the use of a 
random iv guards against the kind of attack it was designed to avoid. I’m 
thinking AES is more modern, making HMAC less useful.

I may be wrong, but it’s worth looking into, I think.

Best,
Bill

William Prothero
http://earthlearningsolutions.org

> On Jul 2, 2018, at 10:56 PM, William Prothero via use-livecode 
> <use-livecode@lists.runrev.com> wrote:
> 
> Brian, thanks for the feedback.
> 
> I started by using random bytes, which was ok, but the php base64encode would 
> only encode characters. So, I couldn’t get the return message to decode in LC 
> correctly. I forget, it could have been the LC decode step, but the upshot 
> was that I decided to go with valid ascii characters for iv because of this.
> 
> I don’t understand the problem with using the milliseconds to generate the 
> random seed, though. The least significant digits of the milliseconds only 
> depends on the random time the user first initiates the query. I assumed the 
> milliseconds counts up to some maximum integer number, then repeats. Hmm, 
> maybe I need to investigate how the counting goes. I had assumed it was just 
> an integer number that counted until it overflowed, then started again from 
> zero. I can investigate this.
> 
> What would the H(MAC) consist of? I haven’t heard of it.
> 
> Best,
> Bill
> 
> William Prothero
> http://earthlearningsolutions.org
> 
>> On Jul 2, 2018, at 9:57 PM, Brian Milby <br...@milby7.com> wrote:
>> 
>> I would suggest using "randombytes" instead of "random" on desktop/server 
>> (according to dictionary is isn't available in mobile, but I have not 
>> actually verified).  That uses the openssl library to generate random 
>> numbers.  The problem with using an IV based on a pseudorandom number 
>> generator seeded from something derived from the time means that it is 
>> potentially predictable.
>> 
>> I was playing around with a function to generate an IV that is guaranteed to 
>> not repeat.  The middle 4 bytes are the seconds, so it reduces the 
>> randomness by 4 bytes.  I'm not sure how much of an issue that would be.  It 
>> does avoid the birthday problem (which should not really be an issue with a 
>> good random number generator I would guess).  Maintaining your own counter 
>> would be another option.  Ensuring uniqueness and unpredictability is the 
>> goal.
>> 
>> One other thing that I was reading is that we should also include a (H)MAC 
>> after the encryption to ensure that the payload is not tampered with.  We 
>> would then only decrypt if the message had not been changed (and the IV 
>> would be included in the MAC calculation).
>> 
>> Below is the code that I was experimenting with:
>> 
>> function generateIV pLength
>>   local tSeconds, tBytes
>> 
>>   put randomBytes(6) into tBytes
>>   put the seconds into tSeconds
>>   repeat until tSeconds < 256
>>      put numToByte(tSeconds mod 256) after tBytes
>>      put tSeconds div 256 into tSeconds
>>   end repeat
>>   put numToByte(tSeconds) after tBytes
>> 
>>   if pLength is empty then put 16 into pLength
>>   subtract length(tBytes) from pLength
>>   if pLength < 0 then
>>      delete byte 1 to (- pLength) of tBytes
>>   else
>>      put randomBytes(pLength) after tBytes
>>   end if
>>   return tBytes
>> end generateIV
>> 
>>> On Mon, Jul 2, 2018 at 10:37 PM, William Prothero via use-livecode 
>>> <use-livecode@lists.runrev.com> wrote:
>>> Folks:
>>> I’ve been working on a sample stack to demonstrate encryption, best 
>>> practices (as far as I can determine).
>>> The online lessons are not adequate for a robust solution to this vital 
>>> security issue. I’ve posted a demo stack at: 
>>> http://earthlearningsolutions.org/google-static-maps-demo/ 
>>> <http://earthlearningsolutions.org/google-static-maps-demo/>  This stack 
>>> has benefited from feedback and ideas from folks on this list. Feedback is 
>>> welcome.
>>> 
>>> This stack generates a random iv vector and uses AES-256 encryption to 
>>> encode an array containing commands for interaction with a mySQL server. 
>>> The server side php script that decodes the data and encodes the returned 
>>> response is included.
>>> 
>>> On thing I am still unsure about is the best way to generate a random 
>>> string of characters that I use for the random IV (initialization vector) 
>>> that is used for the encryption. I’ve included some code below, which is 
>>> used to encrypt and decrypt the data sent and returned from the server. The 
>>> encode and decode scripts are put into the launcher, or stack that is 
>>> created when a standalone or mobile version is built.
>>> 
>>> Here are the handlers. The encryption key will be more secure if it is 
>>> obfuscated by putting it in as a property of a control or hidden in some 
>>> way. I am wondering if the generation of the random seed is optimum.
>>> 
>>> Feedback welcome.
>>> 
>>> local theRandomSeed
>>> 
>>> function randomChrs n
>>>   if theRandomSeed = "" then
>>>      setRandomSeed
>>>   end if
>>>   put "" into tChars
>>>   repeat with i=1 to n
>>>      put random(256) into nChar
>>>      put numToNativeChar(nChar) after tChars
>>>   end repeat
>>>   return tChars
>>> end randomChrs
>>> 
>>> on setRandomSeed
>>>   put (the milliseconds) into tMS
>>>   put trunc(tMs/10000000) into tDiv
>>>   put tMS mod tDiv into theRandomSeed
>>>   set the randomseed to theRandomSeed
>>> end setRandomSeed
>>> 
>>> function theRandomIV
>>>   if theRandomSeed = "" then
>>>      setRandomSeed
>>>   end if
>>>   put randomChrs(16) into tIVBytes
>>>   return tIVBytes
>>> end theRandomIV
>>> 
>>> --This handler encodes the data. First it generates a random
>>> --initialization vector (iv), then encrypts the data and puts
>>> --adds iv to the encoded data.
>>> --tArray is an array that controls the action of the php script.
>>> function theEncoded tArray
>>>   put  theRandomIV() into tIV
>>>   put base64Encode(tIV) into tB64IV
>>>   put ArrayToJSON(tArray,"string”,”") into tJson
>>>   put "AFBDDFCFBDBBDDCCFFACGHDFFFFEEDCC" into tEncryptionKey
>>>   put "AES-256-CTR" into tCipher
>>>   encrypt tJson using tCipher with key tEncryptionKey and iV tIV
>>>   put base64encode(it) into tDataToSend
>>>   --comment out next statement if iv not included in data
>>>   put tB64IV&tDataToSend into tDataToSend
>>>   return tDataToSend
>>> end theEncoded
>>> 
>>> --This decodes the data that is returned by the php on the
>>> --remote server.
>>> --The iv is expected as the first 24 bytes of the returned data.
>>> function theDecoded tData
>>>   put byte 1 to 24 of tData into tIVB64
>>>   put base64decode(tIVB64) into tIV
>>>   put the number of bytes in tData into n
>>>   put byte 25 to n of tData into tRetB64Data
>>>   put base64decode(tRetB64Data) into tRetData
>>>   put "AES-256-CTR" into tCipher
>>>   put "AFBDDFCFBDBBDDCCFFACGHDFFFFEEDCC" into tEncryptionKey
>>>   decrypt tRetData using tCipher with key tEncryptionKey and iV tIV
>>>   put it into tReturn
>>>   return tReturn
>>> end theDecoded
>>> -- End of handlers that should be in the main stack
>>> 
>>> _______________________________________________
>>> use-livecode mailing list
>>> use-livecode@lists.runrev.com
>>> Please visit this url to subscribe, unsubscribe and manage your 
>>> subscription preferences:
>>> http://lists.runrev.com/mailman/listinfo/use-livecode
>> 
> _______________________________________________
> use-livecode mailing list
> use-livecode@lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your subscription 
> preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode


_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

Reply via email to