I just put the PHP on my server and it was able to handle the randombytes IV 
without issue.

The demo does not generate a new IV for the returned data which it really 
should in production.

From a security perspective, you assume that an attacker has access to the 
code. From the encrypted message, an attacker could figure out your next IV.
On Jul 3, 2018, 1:56 AM -0400, William Prothero <waproth...@gmail.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

Reply via email to